使用Readfull读取Java中的大文件

使用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

我有一个10gb大小的大文件, 如果我在java中使用readfull()读取它的全部内容,我会得到一个outofmemoryerror, 因此,我决定使用相同的readfully()读取10gb的大文件,为此,我需要传递readfully()的偏移量和长度参数。偏移量必须是long或double数据类型,以便它可以指向文件的不同部分。但是readfully()只接受int offset。如何解读大数据

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的字节数组(即内容)是根据文件长度动态分配的内存。但这将是一个缓慢的过程。如果我想读大文件,我该怎么办?或者它会对大文件起作用吗?我想读一个大文件无论如何都会很慢。您可能需要调整缓冲区大小,以在快速读取时间和内存资源使用之间实现平衡。