当前位置: 首页 > 面试题库 >

Scanner类是否可以一次将整个文件加载到内存中?

刘才俊
2023-03-14
问题内容

我经常使用Scanner类来读取文件,因为它非常方便。

      String inputFileName;
      Scanner fileScanner;

      inputFileName = "input.txt";
      fileScanner = new Scanner (new File(inputFileName));

我的问题是,以上语句是否一次将整个文件加载到内存中?或者在fileScanner上进行后续调用,例如

      fileScanner.nextLine();

从文件中读取(即从外部存储而不是从内存中读取)?我问是因为我担心如果文件太大而无法一次全部读入内存会发生什么。谢谢。


问题答案:

如果您阅读了源代码,则可以自己回答问题。

看来所讨论的Scanner构造函数的实现显示:

public Scanner(File source) throws FileNotFoundException {
        this((ReadableByteChannel)(new FileInputStream(source).getChannel()));
}

后者包装在阅读器中:

private static Readable makeReadable(ReadableByteChannel source, CharsetDecoder dec) {
    return Channels.newReader(source, dec, -1);
}

并使用缓冲区大小读取

private static final int BUFFER_SIZE = 1024; // change to 1024;

如您在构造链中的最终构造函数中所看到的:

private Scanner(Readable source, Pattern pattern) {
        assert source != null : "source should not be null";
        assert pattern != null : "pattern should not be null";
        this.source = source;
        delimPattern = pattern;
        buf = CharBuffer.allocate(BUFFER_SIZE);
        buf.limit(0);
        matcher = delimPattern.matcher(buf);
        matcher.useTransparentBounds(true);
        matcher.useAnchoringBounds(false);
        useLocale(Locale.getDefault(Locale.Category.FORMAT));
    }

因此,看来扫描仪不会一次读取整个文件。



 类似资料:
  • 问题内容: 我只想从Excel文件(xlsx)中读取10行,而不一次加载整个文件,因为这不能在我的一台计算机上完成(内存不足)。 我尝试使用 看来文件先被加载然后又被分成几部分。 如何只读取第一行? 问题答案: 由于文件的性质(本质上是一堆压缩在一起的文件),您不能将文件戳到任意字节,而希望它成为您感兴趣的表中表格的第N行的开头。 你能做的最好是用与(从文件顶部跳过行)和(从底部跳跃行)参数。但是

  • 问题内容: 我想将包含字符串的巨大文件合并为一个文件,并尝试使用nio2。我不想将整个文件加载到内存中,因此我尝试了BufferedReader: 我对此进行了尝试,但是,它的工作原理,字符串的格式(例如,新行等未复制到合并文件中): 如何在不将整个文件加载到内存的情况下将大型文件与NIO2合并? 问题答案: 如果您想有效地合并两个或多个文件,则应问自己,为什么要使用基础文件并执行该任务。 通过使

  • 问题内容: 我正在处理可处理大量Excel 2007文件的应用程序,并且正在使用OpenPyXL进行此操作。OpenPyXL有两种不同的读取Excel文件的方法:一种是将整个文档立即加载到内存中的“常规”方法,另一种是使用迭代器逐行读取的方法。 问题是,当我使用迭代器方法时,我没有得到任何文档元数据,例如列宽和行/列数,而我 确实 需要此数据。我假设此数据存储在顶部附近的Excel文档中,因此不必

  • 问题内容: 我用np.save()保存了几个numpy数组,并将它们放在一起非常大。 是否可以将它们全部加载为内存映射文件,然后对它们进行串联和切片,而无需将任何内容都加载到内存中? 问题答案: 使用显然将数组加载到内存中。为避免这种情况,您可以轻松地在新文件中创建一个thrid数组,并从要连接的数组中读取值。以更有效的方式,您还可以将新阵列追加到磁盘上已存在的文件中。 在任何情况下,您都必须为数

  • 有没有人看到明显的问题或者知道如何将.trig文件加载到TDB中?

  • 我们使用Apache Camel来压缩和解压缩我们的文件。我们使用标准的和API。 我们的问题是,当我们得到非常大的文件(例如800MB到1GB以上的文件大小)时,我们的应用程序将耗尽内存,因为整个文件被加载到内存中进行压缩和解压缩。 是否有任何骆驼API或java库可以帮助压缩/解压缩文件,而不需要将整个文件加载到内存中。 这里还有一个类似的未解问题