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--]