package li.cil.oc.api.fs; import java.io.IOException; /** * Represents a handle to a file opened from a {@link FileSystem}. */ public interface Handle { /** * The current position in the file. */ long position(); /** * The total length of the file. */ long length(); /** * Closes the handle. * <p/> * For example, if there is an underlying stream, this should close that * stream. Any future calls to {@link #read} or {@link #write} should throw * an <tt>IOException</tt> after this function was called. */ void close(); /** * Tries to read as much data from the file as fits into the specified * array. * <p/> * For files opened in write or append mode this should always throw an * exception. * * @param into the buffer to read the data into. * @return the number of bytes read; -1 if there are no more bytes (EOF). * @throws IOException if the file was opened in writing mode or an * I/O error occurred or the file was already * closed. */ int read(byte[] into) throws IOException; /** * Jump to the specified position in the file, if possible. * <p/> * For files opened in write or append mode this should always throw an * exception. * * @param to the position in the file to jump to. * @return the resulting position in the file. * @throws IOException if the file was opened in write mode. */ long seek(long to) throws IOException; /** * Tries to write all the data from the specified array into the file. * <p/> * For files opened in read mode this should always throw an exception. * * @param value the data to write into the file. * @throws IOException if the file was opened in read-only mode, or * another I/O error occurred (no more space, * for example), or the file was already closed. */ void write(byte[] value) throws IOException; }