Efficient way of handling file pointers in Java? (Using BufferedReader with file pointer)

前端 未结 3 2076
渐次进展
渐次进展 2021-01-01 02:11

I have a log file which gets updated every second. I need to read the log file periodically, and once I do a read, I need to store the file pointer position at the end of t

3条回答
  •  我在风中等你
    2021-01-01 02:47

    I had a similar problem, and I created this class to take lines from BufferedStream, and count how many bytes you have read so far by using getBytes(). We assume the line separator has a single byte by default, and we re-instance the BufferedReader for seek() to work.

    public class FileCounterIterator {
    
        public Long position() {
            return _position;
        }
    
        public Long fileSize() {
            return _fileSize;
        }
    
        public FileCounterIterator newlineLength(Long newNewlineLength) {
            this._newlineLength = newNewlineLength;
            return this;
        }
    
        private Long _fileSize = 0L;
        private Long _position = 0L;
        private Long _newlineLength = 1L;
        private RandomAccessFile fp;
        private BufferedReader itr;
    
        public FileCounterIterator(String filename) throws IOException {
            fp = new RandomAccessFile(filename, "r");
            _fileSize = fp.length();
            this.seek(0L);
        }
    
        public FileCounterIterator seek(Long newPosition) throws IOException {
            this.fp.seek(newPosition);
            this._position = newPosition;
            itr = new BufferedReader(new InputStreamReader(new FileInputStream(fp.getFD())));
            return this;
        }
    
        public Boolean hasNext() throws IOException {
            return this._position < this._fileSize;
        }
    
        public String readLine() throws IOException {
            String nextLine = itr.readLine();
            this._position += nextLine.getBytes().length + _newlineLength;
            return nextLine;
        }
    }
    

提交回复
热议问题