Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
InputStream不工作的Java扫描仪_Java_Inputstream_Java.util.scanner - Fatal编程技术网

InputStream不工作的Java扫描仪

InputStream不工作的Java扫描仪,java,inputstream,java.util.scanner,Java,Inputstream,Java.util.scanner,我正在从一个源读取一个InputStream(fis),我必须对它进行多次搜索。我正在使用Scanner类,每次搜索后我都会实例化它。但它只在第一次起作用。有没有办法重置扫描仪对象?我无法控制这条小溪 Scanner sc = new Scanner(new BufferedReader(new InputStreamReader( fis, MIFConstants.ENCODING_UTF_8))); int count = 0;

我正在从一个源读取一个InputStream(fis),我必须对它进行多次搜索。我正在使用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);

第二次打印返回零。有什么想法吗?

只创建一个
扫描仪,每次都重复使用。问题的出现是因为
BufferedReader
*缓冲*您的输入,这意味着它读取的内容超出了需要,并将其存储起来以备将来使用。当您创建第二个扫描仪时,第一个
BufferedReader`已经抓取了所有输入,没有留下任何要扫描的内容

第二次打印返回零

因为您已经第一次读取到EOS计数行的流。所以当你再次这样做的时候,剩下的行数是零,所以你得到零


按设计工作。

这是错误的解决方案和错误的原因。即使他根本没有
BufferedInputStream
,也会发生这种情况。原因是他在流
fis
上读取EOS,因此当他再次执行所有操作时,没有任何内容可读取。他还创建了第二个
BufferedReader
。这不是问题。为什么需要计算并打印文件中的行数两次?我必须在输入流中反复搜索某行。所以我必须在同一个流上进行多次扫描。我的第一次扫描有效,但下一次扫描无效,因为它已经达到EOF。我想,如果我创建一个新的scanner对象,它应该从流的开头开始。还有其他方法吗?不能在同一个流上进行多次扫描,如上所示。你必须重新打开它。但这是惊人的低效率。您应该在文件的一次扫描中扫描所有需要扫描的内容。我无法关闭和重新打开流,因为我正在从外部源读取它。它就像一个巨大的文本文件,我必须在其中反复搜索字符串。我不想加载到内存中,它会占用堆。在这种情况下,你应该将文件上传到数据库中,在那里你可以查询它。您目前对每个项目扫描一次整个文件的方法无法扩展。它注定要失败。