Java读取文件的几种方式
package com.mesopotamia.test; import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Scanner; import org.apache.log4j.Logger;
/*
* 原文学习请加微信订阅号:it_pupil
* **/
public class FileRead {
private static Logger logger = Logger.getLogger(FileRead.class);
public static void main(String args[]) throws FileNotFoundException{
String path = "C:" + File.separator + "test" + File.separator + "Alice.txt";
readFile3(path);
} public static void readFile(String path) throws FileNotFoundException {
long start = System.currentTimeMillis();//开始时间
int bufSize = 1024;//1K缓冲区
File fin = new File(path);
/*
* 通道就是为操作文件而建立的一个连接。(读写文件、内存映射等)
* 此处的getChannel()可以获取通道;
* 用FileChannel.open(filename)也可以创建一个通道。
* "r"表示只读。
*
* RandomAccessFile是独立与I/O流家族的类,其父类是Object。
* 该类因为有个指针可以挪动,所以,可以从任意位置开始读取文件数据。
* **/
FileChannel fcin = new RandomAccessFile(fin, "r").getChannel();
//给字节缓冲区分配大小
ByteBuffer rBuffer = ByteBuffer.allocate(bufSize);
String enterStr = "\n";
try {
byte[] bs = new byte[bufSize];
String tempString = null;
while (fcin.read(rBuffer) != -1) {//每次读1k到缓冲区
int rSize = rBuffer.position();//记录缓冲区当前位置
rBuffer.rewind();//位置归零,标记取消,方便下次循环重新读入缓冲区。
rBuffer.get(bs);//将缓冲区数据读到字节数组中
rBuffer.clear();//清除缓冲
/*
* 用默认编码将指定字节数组的数据构造成一个字符串
* bs:指定的字节数组,0:数组起始位置;rSize:数组结束位置
* */
tempString = new String(bs, 0, rSize);
int fromIndex = 0;//每次读的开始位置
int endIndex = 0;//每次读的结束位置
//按行读String数据
while ((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1) {
String line = tempString.substring(fromIndex, endIndex);//转换一行
System.out.print(line);
fromIndex = endIndex + 1;
}
}
long end = System.currentTimeMillis();//结束时间
System.out.println("传统IO读取数据,指定缓冲区大小,总共耗时:"+(end - start)+"ms"); } catch (IOException e) {
e.printStackTrace();
}
} public static void readFile1(String path) {
long start = System.currentTimeMillis();//开始时间
File file = new File(path);
if (file.isFile()) {
/*使用Reader家族,表示我要读字符数据了,
*使用该家族中的BufferedReader,表示我要建立缓冲区读字符数据了。
* */
BufferedReader bufferedReader = null;
FileReader fileReader = null;
try {
fileReader = new FileReader(file);
//嵌套使用,装饰者模式,老生常谈。装饰者模式的使用,可以读前面小砖写的《从熏肉大饼到装饰者模式》
bufferedReader = new BufferedReader(fileReader);
String line = bufferedReader.readLine();
//一行一行读
while (line != null) { //按行读数据
System.out.println(line);
line = bufferedReader.readLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//最后一定要关闭
try {
fileReader.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();//结束时间
System.out.println("传统IO读取数据,不指定缓冲区大小,总共耗时:"+(end - start)+"ms");
} }
} public static void readFile3(String path) {
long start = System.currentTimeMillis();//开始时间
long fileLength = 0;
final int BUFFER_SIZE = 0x300000;// 3M的缓冲
File file = new File(path);
fileLength = file.length();
try {
/*使用FileChannel.map方法直接把整个fileLength大小的文件映射到内存中**/
MappedByteBuffer inputBuffer = new RandomAccessFile(file, "r").getChannel()
.map(FileChannel.MapMode.READ_ONLY, 0, fileLength);// 读取大文件
byte[] dst = new byte[BUFFER_SIZE];// 每次读出3M的内容
//每3M做一个循环,分段将inputBuffer的数据取出。
for (int offset = 0; offset < fileLength; offset += BUFFER_SIZE) {
//防止最后一段不够3M
if (fileLength - offset >= BUFFER_SIZE) {
//一个字节一个字节的取出来放到byte[]数组中。
for (int i = 0; i < BUFFER_SIZE; i++)
dst[i] = inputBuffer.get(offset + i);
} else {
for (int i = 0; i < fileLength - offset; i++)
dst[i] = inputBuffer.get(offset + i);
}
// 将得到的3M内容给Scanner,这里的XXX是指Scanner解析的分隔符。
Scanner scan = new Scanner(new ByteArrayInputStream(dst)).useDelimiter("XXX");
//hasNext()所参照的token就是上面的XXX
while (scan.hasNext()) {
// 这里为对读取文本解析的方法
System.out.print(scan.next() + "XXX");
}
scan.close();
}
System.out.println();
long end = System.currentTimeMillis();//结束时间
System.out.println("NIO 内存映射读大文件,总共耗时:"+(end - start)+"ms");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java读取文件的几种方式的更多相关文章
- java读取文件的几种方式性能比较
//普通输入流读取文件内容 public static long checksumInputStream(Path filename) { try(InputStream in= Files.newI ...
- 【文件下载】Java下载文件的几种方式
[文件下载]Java下载文件的几种方式 摘自:https://www.cnblogs.com/sunny3096/p/8204291.html 1.以流的方式下载. public HttpServl ...
- 精通awk系列(3):铺垫知识:读取文件的几种方式
回到: Linux系列文章 Shell系列文章 Awk系列文章 读取文件的几种方式 读取文件有如下几种常见的方式: 下面使用Shell的read命令来演示前4种读取文件的方式(第五种按字节数读取的方式 ...
- Java读写文件的几种方式
自工作以后好久没有整理Java的基础知识了.趁有时间,整理一下Java文件操作的几种方式.无论哪种编程语言,文件读写操作时避免不了的一件事情,Java也不例外.Java读写文件一般是通过字节.字符和行 ...
- java复制文件的4种方式
尽管Java提供了一个可以处理文件的IO操作类.但是没有一个复制文件的方法.复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候.然而有几种方法可以进行Java文件复制操作,下面列举出4中最 ...
- [JAVA]java复制文件的4种方式
尽管Java提供了一个可以处理文件的IO操作类. 但是没有一个复制文件的方法. 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候. 然而有几种方法可以进行Java文件复制操作,下面列举出 ...
- java 下载文件的两种方式和java文件的上传
一:以网络的方式下载文件 try { // path是指欲下载的文件的路径. File file = new File(path); // 以流的形式下载文件. InputStream fis = n ...
- java 读取文件内容 三种形式及效率对比
IOUtils.getStringFromReader() 读取方式为最快的 InputStream in = null; String line = ""; long start ...
- java追加文件的几种方式
import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.FileWriter; import ja ...
随机推荐
- centos7.2下编译安装&&使用-git代码库
centos7.2下编译安装git Git简介 Git是一个分布式版本控制系统 Git vs SVN SVN是典型的集中式版本控制起,版本库集中存放在服务器,当我们用自己的电脑干活儿的时候,需要先从中 ...
- html5 自定义验证信息
h5 为表单新增了很多类型,及属性. 根据这些新增的类型及属性 h5也为我们提供了验证这些数据的js函数,这些验证表单的函数都存在了ValidityState对象中,接下来让我们一起来了解一下这些 ...
- Chrome浏览器Network面板http请求时间分析
Chrome浏览器开发者工具Network窗口下,可以查看下载各组件所需的具体时间 根据上表进行简要分析-- Stalled(阻塞) 浏览器对同一个主机域名的并发连接数有限制,因此如果当前的连接数已经 ...
- js常用正则
var sTest="xxxkdsj234dogdog1234xx"var reTest1=/(dog){2}/var reTest2 = /(?:dog){2}/;console ...
- Linux下错误的捕获:全局变量errno和strerror()
经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因.这个时候使用 ...
- TCP、UDP、IP 协议分析(转)
http://blog.chinaunix.net/uid-26833883-id-3627644.html
- modelsim 中 WAVE窗口中能不能只显示变量名,而不显示路径
可以的,在wave窗口左下角有一个黑色的logo,你点击它就可以省电路径,只显示port名称,再点击就切换回来了,如图红色圈圈标记的logo,你可以试试!
- (转)java中静态代码块的用法 static用法详解
一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来 ...
- 关于rem的计算顺序
/*响应式字体*//* * 字体响应式 * 屏幕>640px时,html字体大小 * 屏幕<640px时,html字体根据屏幕做出相应 * */(function(doc,win){ ...
- Facade设计模式
Facade模式 Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的Facade对象进行.Facade模式提供一个高层次的接口,使得子系统更易于使用. 就如同医院的接待员一样,Fac ...