【问题标题】:Java Scanner with InputStream not working带有 InputStream 的 Java 扫描仪不起作用
【发布时间】:2012-03-20 01:17:07
【问题描述】:

我正在从源中读取 InputStream (fis),并且我必须对其进行多次搜索。我正在使用 Scanner 类,并在每次搜索后实例化它。但它只在第一次工作。有没有办法重置 Scanner 对象?我无法控制流。

Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(
                fis, MIFConstants.ENCODING_UTF_8)));
        int count = 0;
        while (sc.hasNextLine()) {
            count++;
            sc.nextLine();
        }
        System.out.println(count);

        sc = new Scanner(new BufferedReader(new InputStreamReader(fis,
                MIFConstants.ENCODING_UTF_8)));
        count = 0;
        while (sc.hasNextLine()) {
            count++;
            sc.nextLine();
        }
        System.out.println(count);

第二次打印返回零。对此有何想法?

【问题讨论】:

  • 为什么需要两次计算并打印文件中的行数?
  • 我必须一次又一次地在输入流中搜索某些行。所以我必须对同一个流进行多次扫描。我的第一次扫描有效,但下一次扫描并没有导致它已经达到 EOF。我想如果我创建一个新的扫描仪对象,它应该从流的开头开始。我还有其他方法可以解决这个问题吗?
  • 不能对同一个流进行多次扫描,如上所示。您将不得不重新打开它。但这是非常低效的。您应该扫描一次文件中需要扫描的所有内容。
  • 我无法关闭并重新打开流,因为我正在从外部源读取它。这就像一个巨大的文本文件,我必须一遍又一遍地进行字符串搜索。我不想在内存中加载它会吃掉堆。
  • 在这种情况下,您应该将文件上传到可以查询的数据库中。您目前为每个项目扫描整个文件一次的方法不会扩展。它注定要失败。

标签: java inputstream java.util.scanner


【解决方案1】:

只创建一个Scanner,并且每次都重复使用它。问题的发生是因为BufferedReader*buffers* your input -- which means that it reads more than it needs and stores it up for later. When you create your second scanner, all the input has already been grabbed by the firstBufferedReader`,没有留下任何东西可以扫描。

【讨论】:

  • 那是错误的解决方案和错误的原因。即使他根本没有BufferedInputStream,也会发生这种情况。原因是他在流 fis 上读取 EOS,所以当他再次执行所有操作时,就没有什么可读取的了。
  • 他也在创建第二个BufferedReader。这不是问题。
【解决方案2】:

第二次打印返回零。

因为您已经在第一次读取到 EOS 计数行的流。因此,当您再次执行此操作时,剩下的行数为零,因此您将得到零。

按设计工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2015-06-02
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2021-01-14
    相关资源
    最近更新 更多