RandomAccessFileInputStream extends InputStream { @Override public int available() throws IOException { long rangeRelativePosition = raf.getFilePointer() - rangeOffset; long result = rangeLength - rangeRelativePosition; if (result > Integer.MAX_VALUE) { return Integer.MAX_VALUE; } return (int) result; } RandomAccessFileInputStream(File file);  RandomAccessFileInputStream(File file, long rangeOffset, long rangeLength); void setRange(long rangeOffset, long rangeLength); @Override int available(); long getPosition(); @Override void close(); @Override int read(); @Override int read(byte[] b, int off, int len); @Override int read(byte[] b); @Override long skip(long n); @Override boolean markSupported(); @Override void mark(int readlimit); @Override void reset(); long length();  }
@Test public void testAvailable() throws IOException { Assert.assertEquals(testData.length, stream.available()); stream.read(new byte[17]); Assert.assertEquals(testData.length - 17, stream.available()); stream.read(new byte[testData.length]); Assert.assertEquals(0, stream.available()); stream.read(); Assert.assertEquals(0, stream.available()); }