我刚刚被问到一个面试问题,该问题涉及从CSV文件中读取并总结某些单元格中的条目。当被要求对其进行优化时,如果给出一个大小为100 gig的CSV,我就无法回答如何处理内存不足的情况。
在Java中,从文件中读取的工作原理是什么?我们怎么知道什么东西太大了?我们该如何处理?我被告知你可以传入中间读者对象,而不是试图阅读整个事物?
答案 0 :(得分:2)
面试官给了你一个提示 - BufferedReader
。它是逐行读取大文件的有效选择。
小例子:
String line;
BufferedReader br = new BufferedReader("c:/test.txt");
while ((line= br.readLine()) != null) {
//do processing
}
br.close();
Here是文档
答案 1 :(得分:0)
有几种方法可以从Java中读取文件,其中一些方法涉及将所有文件行(或数据)保存在内存中,因为您可以阅读"由换行符等字符分隔的数据(例如,逐行读取)。
对于大型文件,您希望使用Scanner
类(或类似的一次读取特定字节)一次处理较小的位。
示例代码:
FileInputStream inputStream = new FileInputStream(path);
Scanner sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
// System.out.println(line);
}
答案 2 :(得分:-1)
您可以使用RandomAccessFile
来读取文件。但它可能不是最佳解决方案。