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 ");
}
}
In this tutorial, we will learn about the Java Scanner and its methods with the help of examples. The Scanner class of the java.util package is used to read input data from different sources like input streams, users, files, etc.
The method is only terminated when a next line character, is encountered. Like any other class, the Java’s Scanner class contains various overloaded constructors that offer various input methods like System.in, file input, path, etc.
Java Scanner Methods to Take Input Method Description nextInt () reads an int value from the user nextFloat () reads a float value form the user nextBoolean () reads a boolean value from the user nextLine () reads a line of text from the user 5 more rows ...
Basically, Scanner’s get methods read the input character by character instead of reading the entire line at once. getDouble and getInt methods read input until they reach a non-numeric character. In this example, the user entered 99.99 and then hit enter (“ “).
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With