code: @Override
  	public int read() throws IOException {
  		// Read from the queue
  		synchronized(file) {
  			while(true) {
  				long len=file.getLength();
  				if(len>=1) {
  					long pos=file.getFirstIndex();
  					file.file.seek(pos+16);
  					int b=file.file.read();
  					if(b==-1) throw new EOFException("Unexpected EOF");
  					addStats(1);
  					long newFirstIndex=pos+1;
  					while(newFirstIndex>=file.maxFifoLength) newFirstIndex-=file.maxFifoLength;
  					file.setFirstIndex(newFirstIndex);
  					file.setLength(len-1);
  					file.notify();
  					return b;
  				}
  				try {
  					file.wait();
  				} catch(InterruptedException err) {
  					InterruptedIOException ioErr=new InterruptedIOException();
  					ioErr.initCause(err);
  					throw ioErr;
  				}
  			}
  		}
  	}
docs: Reads data from the file, blocks until the data is available.