public int read(byte[] b, int off, int len) throws IOException {
   if (b == null) throw new NullPointerException();
   else if (off < 0 || off > b.length || len < 0 || (off + len) > b.length || (off + len) < 0)
     throw new IndexOutOfBoundsException();
   else if (len == 0) return 0;
   return nativeRead(impl.getFd(), b, off, len);
 }
 public int read() throws IOException {
   return nativeRead(impl.getFd());
 }
 public void close() throws IOException {
   impl.shutdownInput();
 }