java中如何读取文件?

内容摘要
读取文件有多种方式,基于传统的输入流方式或基于nio的Buffer缓冲对象和管道读取方式甚至非常快速的内存映射读取文件。java中四种读取文件方式:(推荐:java视频教程)1、RandomAcce
文章正文

读取文件有多种方式,基于传统的输入流方式或基于nio的Buffer缓冲对象和管道读取方式甚至非常快速的内存映射读取文件。

java中四种读取文件方式:(推荐:java视频教程)

1、RandomAccessFile:随机读取,比较慢优点就是该类可读可写可操作文件指针

2、FileInputStream:io普通输入流方式,速度效率一般

3、Buffer缓冲读取:基于nio Buffer和FileChannel读取,速度较快

4、内存映射读取:基于MappedByteBuffer,速度最快

RandomAccessFile读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//RandomAccessFile类的核心在于其既能读又能写
 
public void useRandomAccessFileTest() throws Exception {
 
    RandomAccessFile randomAccessFile = new RandomAccessFile(new File("e:/nio/test.txt"), "r");
 
    byte[] bytes = new byte[1024];
    int len = 0;
    while ((len = randomAccessFile.read(bytes)) != -1) {
        System.out.println(new String(bytes, 0, len, "gbk"));
    }
 
    randomAccessFile.close();
}

FielInputStream读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//使用FileInputStream文件输入流,比较中规中矩的一种方式,传统阻塞IO操作。
 
public void testFielInputStreamTest() throws Exception {
 
    FileInputStream inputStream = new FileInputStream(new File("e:/nio/test.txt"));
 
    // 使用输入流读取文件,以下代码块几乎就是模板代码
    byte[] bytes = new byte[1024];
    int len = 0;
    while ((len = inputStream.read(bytes)) != -1) {// 如果有数据就一直读写,否则就退出循环体,关闭流资源。
        System.out.println(new String(bytes, 0, len, "gbk"));
    }
    inputStream.close();
}

Buffer缓冲对象读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// nio 读取
 
public void testBufferChannel() throws Exception {
 
    FileInputStream inputStream = new FileInputStream(new File("e:/nio/test.txt"));
 
    FileChannel fileChannel = inputStream.getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(1024);
 
    // 以下代码也几乎是Buffer和Channle的标准读写操作。
    while (true) {
        buffer.clear();
        int result = fileChannel.read(buffer);
        buffer.flip();
        if (result == -1) {
            break;
        }
        System.out.println(new String(buffer.array(), 0, result, "gbk"));
    }
    inputStream.close();
}

内存映射读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public void testmappedByteBuffer() throws Exception {
 
    FileInputStream inputStream = new FileInputStream(new File("e:/nio/test.txt"));
    FileOutputStream outputStream = new FileOutputStream(new File("e:/nio/testcopy.txt"),true);
 
    FileChannel inChannel = inputStream.getChannel();
    FileChannel outChannel = outputStream.getChannel();
 
    System.out.println(inChannel.size());
    MappedByteBuffer mappedByteBuffer = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());
 
    System.out.println(mappedByteBuffer.limit());
    System.out.println(mappedByteBuffer.position());
 
    mappedByteBuffer.flip();
    outChannel.write(mappedByteBuffer);
 
    outChannel.close();
    inChannel.close();
    outputStream.close();
    inputStream.close();
 
}
 
//基于内存映射这种方式,这么写好像有问题。
 
 
MappedByteBuffer和RandomAcessFile这两个类要单独重点研究一下。
 
//TODO 大文件读取

更多java知识请关注java基础教程栏目。

代码注释
[!--zhushi--]

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!