views:

155

answers:

2

Trying to tail / parse some log files. Entries start with a date then can span many lines.

This works, but does not ever see new entries to file.

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() + " ]");
    }
}

Doesn't seem like Scanner's next() or hasNext() detects new entries to file.

Any idea how else I can implement, basically, a tail -f with custom delimiter.


ok - using Kelly's advise i'm checking & refreshing the scanner, this works. Thank you !!

if anyone has improvement suggestions plz do!

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 ");
    }
}
+1  A: 

I would guess that the Scanner is parsing bis which is buffered but the buffer is never getting refreshed. You might be relying on the BufferedInputStream or the Scanner to keep reading bytes from the stream but I think you have to do that yourself.

From the Javadocs:

A BufferedInputStream adds functionality to another input stream-namely, the ability to buffer the input and to support the mark and reset methods. When the BufferedInputStream is created, an internal buffer array is created. As bytes from the stream are read or skipped, the internal buffer is refilled as necessary from the contained input stream, many bytes at a time. The mark operation remembers a point in the input stream and the reset operation causes all the bytes read since the most recent mark operation to be reread before new bytes are taken from the contained input stream.

Kelly French
agreed. modified post with update. thx!
Steve Renyolds
A: 

Your code is blocking because it cannot find the input. If you want it to not block test for hasNext() and then do next().

The token you are looking for is not in the file.

Romain Hippeau