6

试图跟踪/解析一些日志文件。条目以日期开头,然后可以跨越多行。

这有效,但永远不会看到要归档的新条目。

File inputFile = new File("C:/test.txt");
InputStream is = new FileInputStream(inputFile);
InputStream bis = new BufferedInputStream(is);
//bis.skip(inputFile.length());
Scanner src = new Scanner(bis);
src.useDelimiter("\n2010-05-01 ");

while (true) {
    while(src.hasNext()){
    System.out.println("[ " + src.next() + " ]");
    }
}

Scanner 的 next() 或 hasNext() 似乎没有检测到新的文件条目。

知道我还能如何实现,基本上,带有自定义分隔符的 tail -f 。


好的 - 使用凯利的建议,我正在检查并刷新扫描仪,这很有效。谢谢 !!

如果有人有改进建议请做!

File inputFile = new File("C:/test.txt");
InputStream is = new FileInputStream(inputFile);
InputStream bis = new BufferedInputStream(is);
//bis.skip(inputFile.length());
Scanner src = new Scanner(bis);
src.useDelimiter("\n2010-05-01 ");

while (true) {
    while(src.hasNext()){
    System.out.println("[ " + src.next() + " ]");
    }

    Thread.sleep(50);
    if(bis.available() > 0){
    src = new Scanner(bis);
    src.useDelimiter("\n2010-05-01 ");
    }
}
4

1 回答 1

1

我猜想扫描器正在解析bis缓冲但缓冲区永远不会刷新。您可能依赖 BufferedInputStream 或 Scanner 来继续从流中读取字节,但我认为您必须自己这样做。

来自 Javadocs:

BufferedInputStream 向另一个输入流添加了功能,即缓冲输入并支持标记和重置方法的能力。创建 BufferedInputStream 时,会创建一个内部缓冲区数组。当流中的字节被读取或跳过时,内部缓冲区会根据需要从包含的输入流中重新填充,一次很多字节。标记操作会记住输入流中的一个点,并且重置操作会在从包含的输入流中获取新字节之前重新读取自最近一次标记操作以来读取的所有字节。

于 2010-05-03T16:19:22.893 回答