为了账号安全,请及时绑定邮箱和手机立即绑定

java io流如何读取文件效率高

java io流如何读取文件效率高

慕丝7291255 2019-05-16 10:10:41
java io流如何读取文件效率高
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

java提供了搞笑读取文件的方式:文件流,下面以FileInputStream和Apache Commons IO流两种读取方式来详细讲解:

以下两种代码均是读取一个大约1G的文件:

1、文件流
FileInputStream inputStream = null;
Scanner sc = null;
try {
inputStream = new FileInputStream(path);
sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
// System.out.println(line);
}
// note that Scanner suppresses exceptions
if (sc.ioException() != null) {
throw sc.ioException();
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (sc != null) {
sc.close();
}
}
这种方案将会遍历文件中的所有行——允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中:(大约消耗了150MB内存)

2、Apache Commons IO流
同样也可以使用Commons IO库实现,利用该库提供的自定义LineIterator:
LineIterator it = FileUtils.lineIterator(theFile, "UTF-8");
try {
while (it.hasNext()) {
String line = it.nextLine();
// do something with line
}
} finally {
LineIterator.closeQuietly(it);
}
由于整个文件不是全部存放在内存中,这也就导致相当保守的内存消耗:(大约消耗了150MB内存)





查看完整回答
反对 回复 2019-05-17
?
偶然的你

TA贡献1841条经验 获得超3个赞

如果你想读取文本内容,你应该使用InputStreamReader这个类,使用这个类并且指定文本内容的字符集,就可以读出正确的内容。

InputStream这个类是用来读取二进制字节的,比如做文件复制的时候,应该是用InputStream这个类。

不管是InputStreamReader还是InputStream,都可以声明临时缓冲数组,不同的是InputStreamReader声明的数组是:char[] cs = new char[1024]

而InputStream声明的数组是:byte[] bs = new byte[1024]


 

查看完整回答
反对 回复 2019-05-17
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:

Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));
这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。

查看完整回答
反对 回复 2019-05-17
  • 3 回答
  • 0 关注
  • 694 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信