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();
}
}
使用Commons IO遍历文件示例:
LineIterator it = FileUtils.lineIterator(theFile, "UTF-8");
try {
while (it.hasNext()) {
String line = it.nextLine();
// do something with line
}
} finally {
LineIterator.closeQuietly(it);
}
得分点
分次处理
参考答案
标准回答
打开大文件的关键在于,不能直接将文件中的数据全部读取到内存中,以免引发OOM。重点要考虑内存的利用问题,就是如何使用较小的内存空间来解决问题。可以考虑的方式是,每次读取文件中的一部分内容,分多次处理这个文件,具体还要看打开文件的目的。
加分回答
如果访问的是文本文件,我们还可以使用第三方类库来处理问题,例如Apache Commones IO库就提供了遍历文件的工具:LineIterator。它在迭代的过程中不会读取完整的文件,只会消耗较小的内存空间。
延伸阅读
使用Scanner遍历文件示例:
使用Commons IO遍历文件示例: