使用Readfull读取Java中的大文件
我有一个10gb大小的大文件, 如果我在java中使用readfull()读取它的全部内容,我会得到一个outofmemoryerror, 因此,我决定使用相同的readfully()读取10gb的大文件,为此,我需要传递readfully()的偏移量和长度参数。偏移量必须是long或double数据类型,以便它可以指向文件的不同部分。但是readfully()只接受int offset。如何解读大数据使用Readfull读取Java中的大文件,java,file-io,Java,File Io,我有一个10gb大小的大文件, 如果我在java中使用readfull()读取它的全部内容,我会得到一个outofmemoryerror, 因此,我决定使用相同的readfully()读取10gb的大文件,为此,我需要传递readfully()的偏移量和长度参数。偏移量必须是long或double数据类型,以便它可以指向文件的不同部分。但是readfully()只接受int offset。如何解读大数据 try { IOUtils.readFully(in, contents, minO
try {
IOUtils.readFully(in, contents, minOffset, maxOffset);
value.set(contents, 0, contents.length);
} finally {
IOUtils.closeStream(in);
}
我可以使用
seek()
到达特定位置,然后从该位置使用readfully()
吗 使用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();
}
}
此解决方案将迭代文件中的所有行—允许处理每一行—而不保留对它们的引用—最后,不将它们保留在内存中。有关更多详细信息,请参见。“我可以使用seek()到达特定位置,然后从该位置使用readfully()”为什么不试试呢?既然您不想一次读取整个文件,为什么要使用
readFully
而不是适当的流式处理呢?我敢打赌,您不会从显示的代码中得到任何OutOfMemoryError—其中没有内存分配。一个好的开始是阅读javadocs,了解readFully的功能。我传递给readFully的字节数组(即内容)是根据文件长度动态分配的内存。但这将是一个缓慢的过程。如果我想读大文件,我该怎么办?或者它会对大文件起作用吗?我想读一个大文件无论如何都会很慢。您可能需要调整缓冲区大小,以在快速读取时间和内存资源使用之间实现平衡。