Java Scanner不会关注文件

Ste*_*lds 6 java io tail java.util.scanner

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

这有效,但是没有看到要提交的新条目.

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() + " ]");
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来不像Scanner的next()或hasNext()检测到新的文件条目.

任何想法我还能实现,基本上,一个带有自定义分隔符的tail -f.


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

如果有人有改进建议PLZ吗!

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 ");
    }
}
Run Code Online (Sandbox Code Playgroud)

Kel*_*nch 1

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

来自 Java 文档:

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