标准IO,带缓冲的标准IO,内存映射等在Java中的实现:

1 package com.mesopotamia.test;  2   3 import java.io.BufferedReader;  4 import java.io.ByteArrayInputStream;  5 import java.io.File;  6 import java.io.FileNotFoundException;  7 import java.io.FileReader;  8 import java.io.IOException;  9 import java.io.RandomAccessFile; 10 import java.nio.ByteBuffer; 11 import java.nio.MappedByteBuffer; 12 import java.nio.channels.FileChannel; 13 import java.util.Scanner; 14  15 import org.apache.log4j.Logger; 16 /* 17  * 原文学习请加微信订阅号:it_pupil 18  * **/ 19 public class FileRead { 20     private static Logger logger = Logger.getLogger(FileRead.class);

21     public static void main(String args[]) throws FileNotFoundException{ 22         String path = "C:" + File.separator + "test" + File.separator + "Alice.txt";

23         readFile3(path); 24     } 25      26     public static void readFile(String path) throws FileNotFoundException { 27         long start = System.currentTimeMillis();//开始时间 28         int bufSize = 1024;//1K缓冲区 29         File fin = new File(path);

30         /* 31          * 通道就是为操作文件而建立的一个连接。(读写文件、内存映射等) 32          * 此处的getChannel()可以获取通道; 33          * 用FileChannel.open(filename)也可以创建一个通道。 34          * "r"表示只读。 35          *

36          * RandomAccessFile是独立与I/O流家族的类,其父类是Object。 37          * 该类因为有个指针可以挪动,所以,可以从任意位置开始读取文件数据。 38          * **/ 39         FileChannel fcin = new RandomAccessFile(fin, "r").getChannel(); 40         //给字节缓冲区分配大小 41         ByteBuffer rBuffer = ByteBuffer.allocate(bufSize);

42         String enterStr = "\n"; 43         try { 44             byte[] bs = new byte[bufSize]; 45             String tempString = null; 46             while (fcin.read(rBuffer) != -1) {//每次读1k到缓冲区 47                 int rSize = rBuffer.position();//记录缓冲区当前位置 48                 rBuffer.rewind();//位置归零,标记取消,方便下次循环重新读入缓冲区。 49                 rBuffer.get(bs);//将缓冲区数据读到字节数组中 50                 rBuffer.clear();//清除缓冲 51                 /* 52                  * 用默认编码将指定字节数组的数据构造成一个字符串 53                  * bs:指定的字节数组,0:数组起始位置;rSize:数组结束位置 54                  * */ 55                 tempString = new String(bs, 0, rSize); 56                 int fromIndex = 0;//每次读的开始位置 57                 int endIndex = 0;//每次读的结束位置 58                 //按行读String数据 59                 while ((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1) { 60                     String line = tempString.substring(fromIndex, endIndex);//转换一行             61                     System.out.print(line);

62                     fromIndex = endIndex + 1; 63                 } 64             } 65             long end = System.currentTimeMillis();//结束时间 66             System.out.println("传统IO读取数据,指定缓冲区大小,总共耗时:"+(end - start)+"ms"); 67  68         } catch (IOException e) { 69             e.printStackTrace(); 70         } 71     } 72      73     public static void readFile1(String path) {

74         long start = System.currentTimeMillis();//开始时间 75         File file = new File(path);

76         if (file.isFile()) {

77             /*使用Reader家族,表示我要读字符数据了, 78              *使用该家族中的BufferedReader,表示我要建立缓冲区读字符数据了。 79              * */ 80             BufferedReader bufferedReader = null;

81             FileReader fileReader = null;

82             try {

83                 fileReader = new FileReader(file);

84                 //嵌套使用,装饰者模式,老生常谈。装饰者模式的使用,可以读前面小砖写的《从熏肉大饼到装饰者模式》 85                 bufferedReader = new BufferedReader(fileReader);

86                 String line = bufferedReader.readLine();

87                 //一行一行读 88                 while (line != null) { //按行读数据 89                     System.out.println(line);

90                     line = bufferedReader.readLine();

91                 }

92             } catch (FileNotFoundException e) {

93                 e.printStackTrace();

94             } catch (IOException e) {

95                 e.printStackTrace();

96             } finally {

97                 //最后一定要关闭 98                 try {

99                     fileReader.close();

100                     bufferedReader.close();

101                 } catch (IOException e) {

102                     e.printStackTrace();

103                 }

104                 long end = System.currentTimeMillis();//结束时间105                 System.out.println("传统IO读取数据,不指定缓冲区大小,总共耗时:"+(end - start)+"ms");106             }

107   108         }

109     }

110     111     public static void readFile3(String path) {112         long start = System.currentTimeMillis();//开始时间113         long fileLength = 0;

114         final int BUFFER_SIZE = 0x300000;// 3M的缓冲  115             File file = new File(path);

116             fileLength = file.length();

117             try {

118                 /*使用FileChannel.map方法直接把整个fileLength大小的文件映射到内存中**/119                 MappedByteBuffer inputBuffer = new RandomAccessFile(file, "r").getChannel()120                     .map(FileChannel.MapMode.READ_ONLY, 0, fileLength);// 读取大文件  121                 byte[] dst = new byte[BUFFER_SIZE];// 每次读出3M的内容122                 //每3M做一个循环,分段将inputBuffer的数据取出。123                 for (int offset = 0; offset = BUFFER_SIZE) {126                         //一个字节一个字节的取出来放到byte[]数组中。127                         for (int i = 0; i

128                             dst[i] = inputBuffer.get(offset + i);

129                     } else {

130                         for (int i = 0; i

131                             dst[i] = inputBuffer.get(offset + i);

132                     }

133                     // 将得到的3M内容给Scanner,这里的XXX是指Scanner解析的分隔符。134                     Scanner scan = new Scanner(new ByteArrayInputStream(dst)).useDelimiter("XXX");

135                     //hasNext()所参照的token就是上面的XXX136                     while (scan.hasNext()) {

137                         // 这里为对读取文本解析的方法  138                         System.out.print(scan.next() + "XXX");

139                     }

140                     scan.close();

141                 }

142                 System.out.println();143                 long end = System.currentTimeMillis();//结束时间144                 System.out.println("NIO 内存映射读大文件,总共耗时:"+(end - start)+"ms");145             } catch (Exception e) {

146                 e.printStackTrace();

147             }

148     }

149 }

本文转自xsster51CTO博客,原文链接http://blog.51cto.com/12945177/1929781 ,如需转载请自行联系原作者

文件的存取方式java_三种访问文件的方式相关推荐

  1. 关于Struts2三种访问Servlet API方式的总结

    在开发j2ee过程中,通常我们需要访问的Servlet API是:HttpSession,HttpservletRequest,ServletContext,这三者分别对应于JSP的内置对象:sess ...

  2. python打开文件不存在-Python判断文件是否存在的三种方法

    原标题:Python判断文件是否存在的三种方法 通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先判断文件是否存在. 这里将介绍三种判断文件 ...

  3. python3 判断文件是否存在_Python判断文件是否存在的三种方法

    正文 通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先判断文件是否存在. 这里将介绍三种判断文件或文件夹是否存在的方法,分别使用os模块. ...

  4. java中三种方法_Java文件I/O的三种方法

    Java文件I/O的三种方法 RandomAccessFile是不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和DataOutput接口之外(Data ...

  5. C#利用WCF改进文件流传输的三种方式

    摘要:本文介绍C#利用WCF改进文件流传输的三种方式:MTOM模型.基于同步传输的异步回调模型.基于异步传输的异步模型,并提供相应的实现代码供参考. - WCF在跨域传输使用了两种模型的方法调用:一种 ...

  6. python文件是否存在_Python判断文件是否存在的三种方法

    通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先判断文件是否存在. 这里将介绍三种判断文件或文件夹是否存在的方法,分别使用os模块.Try ...

  7. python中判断文件是否存在的三种方式_Python中判断文件是否存在的方法

    Python中判断文件是否存在的方法 发布时间:2020-08-06 11:15:42 来源:亿速云 阅读:58 作者:小新 这篇文章主要介绍Python中判断文件是否存在的方法,文中介绍的非常详细, ...

  8. (0095)iOS开发之本地文件预览的三种方法(3)

    (0090)iOS开发之本地文件预览的三种方法(1) (0094)iOS开发之本地文件预览的三种方法(2) 用功能强大的Webview来实现文件预览功能 我导入的 ios.pdf 前两种可以打开,但是 ...

  9. (0094)iOS开发之本地文件预览的三种方法(2)

    (0090)iOS开发之本地文件预览的三种方法(1) (0095)iOS开发之本地文件预览的三种方法(3) QuickLook预览文件 quickLook预览文件也是系统提供的预览方法,具体使用如下 ...

最新文章

  1. R语言使用reshape2包的dcast函数将dataframe从长表到宽表(Long- to wide-format)、指定单个标识符、、表格转化的时候值不唯一设置聚合函数(均值)
  2. 学习笔记整理之StringBuffer与StringBulider的线程安全与线程不安全
  3. Solidity编程 二 之Solidity安装
  4. 华为鸿蒙ipc时延,虚搜
  5. centos7系统引导自动重启_分享一个实用的脚本——全自动一键批量性安装Linux系统...
  6. 教你 7 步快速构建 GitLab 持续集成环境
  7. 刷新机制_云顶之弈:新版本推出新机制,可刷新指定羁绊,还可分解没用装备...
  8. H.265编码和H.264编码的区别
  9. 指针和字符串,数组和字符串(1)
  10. paip.提升性能----SQL优化总结
  11. [转]虚方法(virtual)和抽象方法(abstract)的区别
  12. SQL Server迁移数据库文件(ldfmdf文件)到其他盘
  13. ProCAD.2D/3D.Designer.v2008.1 1CD(最大程度地提高管道设计效率)\
  14. Excel常用快捷键大全
  15. 软件工程能调剂到计算机么,愿意调剂到计算机专业或软件工程专业
  16. jasperreport报表导出excel锁定行和列
  17. Roaring64NavigableMap(Bitmap)简单使用
  18. 轻松搭建一个BI销售数据分析系统
  19. SAP—IDoc操作步骤
  20. Spring核心原理及工作方式

热门文章

  1. 五个案例让你明白GCD死锁
  2. 多线程下的单例模式你真的了解吗?
  3. Ajax datatype:'JSON'的error问题Status1:200,JSON格式
  4. Android开发工具大全【转】
  5. 一个老程序员对数据库的一点纠结
  6. 小程序获取用户手机号_借助云开发5行代码获取小程序用户的手机号
  7. Python实现视频语音和字幕自动审查功能
  8. 旅游网站的主页代码_影响外贸网站seo排名的因素有哪些?
  9. android studio怎么输入中文,怎么在linux版的AndroidStudio输入中文?
  10. php计算字符串散列,php计算字符串的SHA-1散列函数sha1()