package org.archive.util.binsearch.impl; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.util.logging.Logger; import org.archive.util.binsearch.SeekableLineReader; public class RandomAccessFileSeekableLineReader implements SeekableLineReader { private static final Logger LOGGER = Logger.getLogger(RandomAccessFileSeekableLineReader.class.getName()); private RandomAccessFile raf; private BufferedReader br; private FileInputStream fis; private InputStreamReader isr; private int blockSize; private boolean closed; public RandomAccessFileSeekableLineReader(RandomAccessFile raf, int blockSize) { this.raf = raf; this.blockSize = blockSize; br = null; fis = null; isr = null; closed = false; } public void seek(long offset) throws IOException { if(closed) { throw new IOException("Seek after close()"); } raf.seek(offset); fis = new FileInputStream(raf.getFD()); isr = new InputStreamReader(fis, UTF8); br = new BufferedReader(isr, blockSize); } public String readLine() throws IOException { if(closed) { return null; } if(br == null) { seek(0); } return br.readLine(); } public void close() throws IOException { if(closed) { LOGGER.info(String.format("Error already closed")); return; } closed = true; raf.close(); // fis.close(); } public long getSize() throws IOException { return raf.length(); } }