commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Georg Henzler (Commented) (JIRA)" <>
Subject [jira] [Commented] (IO-288) Supply a ReverseFileReader
Date Tue, 18 Oct 2011 22:53:11 GMT


Georg Henzler commented on IO-288:

I will provide you with Unit tests if you're interested - I tested the class with a main class
and different input files but it's easy to make Unit tests from the main class. 

Regarding your questions:
- The Tailer class listens to file changes (as the unix tail does) and notifies a provided
Listener passing the added line. The ReverseFileReader starts at the last line of a file and
moves towards the start of the file (ignoring added lines after it has instantiated).
- We could subclass FileReader but I'm not sure how to implement e.g. read(char[] cbuf, int
off, int len)... implementing this going backward would be hard. Mixing going forward and
backward is probably not really intuitive. I would suggest that if we implement FileReader,
we throw a UnsupportedOperationException for most of the Reader inferface's methods. 
- I'm not sure of the Filename... is BufferedReverseFileReader a better name to emphasize
on the fact that it's all about the method readLine()? Any other name suggestions? 

> Supply a ReverseFileReader
> --------------------------
>                 Key: IO-288
>                 URL:
>             Project: Commons IO
>          Issue Type: New Feature
>          Components: Utilities
>            Reporter: Georg Henzler
>         Attachments:
> I needed to analyse a log file today and I was looking for a ReverseFileReader: A class
that behaves exactly like BufferedReader except that it goes from bottom to top when readLine()
is called. I didn't find it in IOUtils and the internet didn't help a lot either, e.g.
is a fairly inefficient - the log files I'm analysing are huge and it is not a good idea to
load the whole content in the memory. 
> So I ended up writing an implementation myself using little memory and the class RandomAccessFile
- see attached file. It's used as follows:
> int blockSize = 4096; // only that much memory is needed, no matter how big the file
> ReverseFileReader reverseFileReader = new ReverseFileReader(myFile, blockSize, "UTF-8");
// encoding is supported
> String line = null;
> while((line=reverseFileReader.readLine())!=null) {
>   ... // use the line
>   if(enoughLinesSeen) {
>      break;  
>   }
> }
> reverseFileReader.close();
> I believe this could be useful for other people as well!

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:!default.jspa
For more information on JIRA, see:


View raw message