文件的存取方式java_三种访问文件的方式
标准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_三种访问文件的方式相关推荐
- 关于Struts2三种访问Servlet API方式的总结
在开发j2ee过程中,通常我们需要访问的Servlet API是:HttpSession,HttpservletRequest,ServletContext,这三者分别对应于JSP的内置对象:sess ...
- python打开文件不存在-Python判断文件是否存在的三种方法
原标题:Python判断文件是否存在的三种方法 通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先判断文件是否存在. 这里将介绍三种判断文件 ...
- python3 判断文件是否存在_Python判断文件是否存在的三种方法
正文 通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先判断文件是否存在. 这里将介绍三种判断文件或文件夹是否存在的方法,分别使用os模块. ...
- java中三种方法_Java文件I/O的三种方法
Java文件I/O的三种方法 RandomAccessFile是不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和DataOutput接口之外(Data ...
- C#利用WCF改进文件流传输的三种方式
摘要:本文介绍C#利用WCF改进文件流传输的三种方式:MTOM模型.基于同步传输的异步回调模型.基于异步传输的异步模型,并提供相应的实现代码供参考. - WCF在跨域传输使用了两种模型的方法调用:一种 ...
- python文件是否存在_Python判断文件是否存在的三种方法
通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先判断文件是否存在. 这里将介绍三种判断文件或文件夹是否存在的方法,分别使用os模块.Try ...
- python中判断文件是否存在的三种方式_Python中判断文件是否存在的方法
Python中判断文件是否存在的方法 发布时间:2020-08-06 11:15:42 来源:亿速云 阅读:58 作者:小新 这篇文章主要介绍Python中判断文件是否存在的方法,文中介绍的非常详细, ...
- (0095)iOS开发之本地文件预览的三种方法(3)
(0090)iOS开发之本地文件预览的三种方法(1) (0094)iOS开发之本地文件预览的三种方法(2) 用功能强大的Webview来实现文件预览功能 我导入的 ios.pdf 前两种可以打开,但是 ...
- (0094)iOS开发之本地文件预览的三种方法(2)
(0090)iOS开发之本地文件预览的三种方法(1) (0095)iOS开发之本地文件预览的三种方法(3) QuickLook预览文件 quickLook预览文件也是系统提供的预览方法,具体使用如下 ...
最新文章
- R语言使用reshape2包的dcast函数将dataframe从长表到宽表(Long- to wide-format)、指定单个标识符、、表格转化的时候值不唯一设置聚合函数(均值)
- 学习笔记整理之StringBuffer与StringBulider的线程安全与线程不安全
- Solidity编程 二 之Solidity安装
- 华为鸿蒙ipc时延,虚搜
- centos7系统引导自动重启_分享一个实用的脚本——全自动一键批量性安装Linux系统...
- 教你 7 步快速构建 GitLab 持续集成环境
- 刷新机制_云顶之弈:新版本推出新机制,可刷新指定羁绊,还可分解没用装备...
- H.265编码和H.264编码的区别
- 指针和字符串,数组和字符串(1)
- paip.提升性能----SQL优化总结
- [转]虚方法(virtual)和抽象方法(abstract)的区别
- SQL Server迁移数据库文件(ldfmdf文件)到其他盘
- ProCAD.2D/3D.Designer.v2008.1 1CD(最大程度地提高管道设计效率)\
- Excel常用快捷键大全
- 软件工程能调剂到计算机么,愿意调剂到计算机专业或软件工程专业
- jasperreport报表导出excel锁定行和列
- Roaring64NavigableMap(Bitmap)简单使用
- 轻松搭建一个BI销售数据分析系统
- SAP—IDoc操作步骤
- Spring核心原理及工作方式
热门文章
- 五个案例让你明白GCD死锁
- 多线程下的单例模式你真的了解吗?
- Ajax datatype:'JSON'的error问题Status1:200,JSON格式
- Android开发工具大全【转】
- 一个老程序员对数据库的一点纠结
- 小程序获取用户手机号_借助云开发5行代码获取小程序用户的手机号
- Python实现视频语音和字幕自动审查功能
- 旅游网站的主页代码_影响外贸网站seo排名的因素有哪些?
- android studio怎么输入中文,怎么在linux版的AndroidStudio输入中文?
- php计算字符串散列,php计算字符串的SHA-1散列函数sha1()