我有一个大小为10gb的大文件, 如果我在java中使用readfully()读取它的全部内容,我会得到一个outofmemoryerror, 所以我决定使用相同的readfully()读取部分大10gb文件,为此我需要传递readfully()的offset和length参数。偏移量必须是long或double数据类型,以便它可以指向文件的不同部分。但readfully()只接受int offset。如何阅读大数据?
try {
IOUtils.readFully(in, contents, minOffset, maxOffset);
value.set(contents, 0, contents.length);
} finally {
IOUtils.closeStream(in);
}
我可以使用seek()
到达特定位置,然后从该位置使用readfully()
吗?
答案 0 :(得分:1)
使用java.util.Scanner类来遍历文件的内容并逐个连续地检索行:
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();
}
}
此解决方案将遍历文件中的所有行 - 允许处理每一行 - 而不保留对它们的引用 - 最后,不将它们保留在内存中。有关详细信息,请参阅this。