InputStream不工作的Java扫描仪
我正在从一个源读取一个InputStream(fis),我必须对它进行多次搜索。我正在使用Scanner类,每次搜索后我都会实例化它。但它只在第一次起作用。有没有办法重置扫描仪对象?我无法控制这条小溪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;
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对象,它应该从流的开头开始。还有其他方法吗?不能在同一个流上进行多次扫描,如上所示。你必须重新打开它。但这是惊人的低效率。您应该在文件的一次扫描中扫描所有需要扫描的内容。我无法关闭和重新打开流,因为我正在从外部源读取它。它就像一个巨大的文本文件,我必须在其中反复搜索字符串。我不想加载到内存中,它会占用堆。在这种情况下,你应该将文件上传到数据库中,在那里你可以查询它。您目前对每个项目扫描一次整个文件的方法无法扩展。它注定要失败。