package com.onionnetworks.io; import java.io.*; import java.net.*; public class RAFInputStream extends InputStream { RAF raf; long pos; public RAFInputStream(RAF raf) { this.raf = raf; } /** * wraps read(byte[],int,int) to read a single byte. */ public int read() throws IOException { byte[] b = new byte[1]; if (read(b,0,1) == -1) { return -1; } return b[0] & 0xFF; } public int read(byte[] b, int off, int len) throws IOException { if (raf == null) { throw new EOFException(); } int c = raf.seekAndRead(pos,b,off,len); if (c >= 0) { pos += c; } return c; } public long skip(long n) throws IOException { // don't skip if n < 0 if (n > 0) { // don't skip beyond the EOF long result = Math.min(raf.length(),pos+n) - pos; pos += result; return result; } return 0; } // This does not close the underlying RAF. public void close() throws IOException { raf = null; } }