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

de.schlichtherle.io.rof.FastReadOnlyFile Maven / Gradle / Ivy

Go to download

TrueZIP is a Java based Virtual File System (VFS) to enable transparent, multi-threaded read/write access to archive files (ZIP, TAR etc.) as if they were directories. Archive files may be arbitrarily nested and the nesting level is only limited by heap and file system size.

The newest version!
/*
 * Copyright (C) 2005-2010 Schlichtherle IT Services
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package de.schlichtherle.io.rof;

import java.io.*;

/**
 * A {@link ReadOnlyFile} implementation using a {@link RandomAccessFile} with
 * a cached file pointer.
 * This implementation skips unnecessary file pointer operations for the
 * operating system.
 *
 * @deprecated Depending on the implementation of the J2SE API, this class
 *             most likely does not provide any performance improvement.
 *             Use where necessary only!
 * @author Christian Schlichtherle
 * @version $Id: FastReadOnlyFile.java,v 1.3 2010/08/16 10:55:48 christian_schlichtherle Exp $
 */
public class FastReadOnlyFile
        extends RandomAccessFile
        implements ReadOnlyFile
{
    /** The current file pointer in the file. */
    private long fp;

    private boolean closed;
    
    public FastReadOnlyFile(File file)
    throws FileNotFoundException {
        super(file, "r");
    }

    public long getFilePointer() throws IOException {
        ensureOpen();
        return fp;
    }

    public void seek(final long pos) throws IOException {
        if (pos == fp) {
            ensureOpen();
            return;
        }
        super.seek(pos);
        fp = pos;
    }

    public int read() throws IOException {
        final int ret = super.read();
        if (ret != -1)
            fp++;
        return ret;
    }

    public int read(final byte[] b, final int off, final int len)
    throws IOException {
        final int ret = super.read(b, off, len);
        if (ret != -1)
            fp += ret;
        return ret;
    }
    
    public void close() throws IOException {
        super.close();
        closed = true;
    }

    /**
     * Ensures that this file is open.
     *
     * @throws IOException If the preconditions do not hold.
     */
    private final void ensureOpen() throws IOException {
        if (closed)
            throw new IOException("file is closed");
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy