首页 > 试题广场 >

如何打开一个大文件

[问答题]

如何打开一个大文件

推荐

得分点

​ 分次处理

参考答案

标准回答

​ 打开大文件的关键在于,不能直接将文件中的数据全部读取到内存中,以免引发OOM。重点要考虑内存的利用问题,就是如何使用较小的内存空间来解决问题。可以考虑的方式是,每次读取文件中的一部分内容,分多次处理这个文件,具体还要看打开文件的目的。

  1. 如果我们打开的是文本文件,期望读取甚至分析该文件中的内容,则可以采用java.util.Scanner来逐行读取文件的内容。在Scanner遍历文件的过程中,每处理一行之后,我们都要丢弃对该行的引用,以节约内存。
  2. 如果我们打开的是字节文件,期望拷贝或者搬运该文件中的内容,则可以采用缓冲流或NIO。每次利用缓冲区处理文件中的一小段数据,这样在处理过程中使用的内存空间便是很有限的,不会造成内存溢出的问题。

加分回答

​ 如果访问的是文本文件,我们还可以使用第三方类库来处理问题,例如Apache Commones IO库就提供了遍历文件的工具:LineIterator。它在迭代的过程中不会读取完整的文件,只会消耗较小的内存空间。

延伸阅读

​ 使用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();
    }
}

​ 使用Commons IO遍历文件示例:

LineIterator it = FileUtils.lineIterator(theFile, "UTF-8");
try {
    while (it.hasNext()) {
        String line = it.nextLine();
        // do something with line
    }
} finally {
    LineIterator.closeQuietly(it);
}
编辑于 2021-09-15 10:40:11 回复(0)
链接:https://www.nowcoder.com/questionTerminal/945b3c8e156d40c2bb3ade0b520e3881
来源:牛客网

参考答案

标准回答

打开大文件的关键在于,不能直接将文件中的数据全部读取到内存中,以免引发OOM。重点要考虑内存的利用问题,就是如何使用较小的内存空间来解决问题。可以考虑的方式是,每次读取文件中的一部分内容,分多次处理这个文件,具体还要看打开文件的目的。

  1. 如果我们打开的是文本文件,期望读取甚至分析该文件中的内容,则可以采用java.util.Scanner来逐行读取文件的内容。在Scanner遍历文件的过程中,每处理一行之后,我们都要丢弃对该行的引用,以节约内存。
  2. 如果我们打开的是字节文件,期望拷贝或者搬运该文件中的内容,则可以采用缓冲流或NIO。每次利用缓冲区处理文件中的一小段数据,这样在处理过程中使用的内存空间便是很有限的,不会造成内存溢出的问题。

加分回答

如果访问的是文本文件,我们还可以使用第三方类库来处理问题,例如Apache Commones IO库就提供了遍历文件的工具:LineIterator。它在迭代的过程中不会读取完整的文件,只会消耗较小的内存空间。

发表于 2021-11-17 11:26:20 回复(0)