All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.archive.util.binsearch.impl.NIOSeekableLineReaderFactory Maven / Gradle / Ivy

The newest version!
package org.archive.util.binsearch.impl;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

import org.archive.util.binsearch.SeekableLineReader;
import org.archive.util.binsearch.SeekableLineReaderFactory;

/**
 * A SeekableLineReaderFactory that opens a file ONCE at construction.
 * 
 * Should be able to re-use the same FileChannel across threads, and might be
 * more efficient than the RandomAccessFileSeekableLineReaderXXX classes.
 * 
 * @author brad
 *
 */
public class NIOSeekableLineReaderFactory implements SeekableLineReaderFactory {
	private File file;
	private FileChannel fc;
	private RandomAccessFile raf;
	private int blockSize;
	private NIOType type = NIOType.PLAIN;
	
	public static enum NIOType {
	    PLAIN,
	    MMAP,
	};
	
	public NIOSeekableLineReaderFactory(File file, int blockSize, NIOType type) throws IOException {
		this.file = file;
		this.type = type;
		this.blockSize = blockSize;
		this.raf = new RandomAccessFile(file,"r");
		this.fc = raf.getChannel();
	}
	
	public NIOSeekableLineReaderFactory(File file, int blockSize) throws IOException {
	    this(file, blockSize, NIOType.PLAIN);
	}
	
	public NIOSeekableLineReaderFactory(File file) throws IOException {
		this(file, BINSEARCH_BLOCK_SIZE);
	}
	
	public SeekableLineReader get() throws IOException {
	    return new NIOSeekableLineReader(fc, blockSize, type);	        
	}
	
	public void close() throws IOException
	{
		if (raf != null) {
			raf.close();
		}
	}
	
	public long getModTime()
	{
		return file.lastModified();
	}

	@Override
    public void reload() throws IOException {
        RandomAccessFile newRAF = new RandomAccessFile(file, "r");
        FileChannel newFc = raf.getChannel();
        
        RandomAccessFile oldRaf = raf;
        
        synchronized(this) {
        	this.raf = newRAF;
        	this.fc= newFc;
        }
        
       	if (oldRaf != null) {
       		oldRaf.close();
       	}
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy