一、内存读取法:简单明了,不玩阴的
此方法的思路很简单,就是把文件直接读取到内存中,然后进行操作。
1.1 方法一:使用java.nio.file.Files读取文本文件
使用Files类将文件的所有内容读入字节数组。Files类还有一个方法可以读取所有行到字符串列表。Files类是在Java 7中引入的,如果想加载所有文件内容,使用这个类是比较适合的。只有在处理小文件并且需要加载所有文件内容到内存中时才应使用此方法。
-
public static void readFileByFiles(String pathname) {
-
Path path = Paths.get(pathname);
-
try {
-
/*
-
* 使用readAllLines的时候,小文件可以很快读取.
-
* 那么更大的文件,读取的肯定会爆了。
-
*/
-
//List<String> lines = Files.readAllLines(path);
-
byte[] bytes = Files.readAllBytes(path);
-
String str = new String(bytes);
-
System.out.println(str);
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
对于小文件,轻松就可以读取进来;
对于大文件就会抛出如下异常:
或者是:
结论:小文件可以使用这种方式;读取大文件,不能使用。
二、IO逐行读取法:循序渐进,好舒服
2.1 方法二:使用java.io.FileReader类
可以使用FileReader获取BufferedReader,然后逐行读取文件,FileRead也有读取char的方法,当然这样的读取方式效率很低很低了。
-
public static void readFileByFileReader(String pathname) {
-
File file = new File(pathname);
-
FileReader fileReader;
-
BufferedReader bufferedReader;
-
try {
-
fileReader = new FileReader(file);
-
bufferedReader = new BufferedReader(fileReader);
-
String line;
-
StringBuffer buffer = new StringBuffer();
-
while((line = bufferedReader.readLine()) != null){
-
// 一行一行地处理...
-
//System.out.println(line);
-
//处理字符串,并不会将字符串保存真正保存到内存中
-
// 这里简单模拟下处理操作.
-
buffer.append(line.substring(0,1));
-
}
-
System.out.println("buffer.length:"+buffer.length());
-
} catch (FileNotFoundException e) {
-
e.printStackTrace();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}finally {
-
//TODO close处理.
-
}
-
}
对于大文件可以逐行读取,没啥问题,测试了下:3.46G 耗时:11秒
注意:这里本质是使用了BufferedReader的缓冲,如果是使用的fileReader读取char的方式,那么时间会更久。
。。。。。。。。。。。。。。。。。
版权原因,完整文章,请参考如下:100G的文件如何读取 - 第306篇