【发布时间】: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