使用readfully在Java中读取大文件

时间:2014-06-13 17:45:09

标签: java file-io

我有一个大小为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()吗?

1 个答案:

答案 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