long read(FileDescriptor fd, ByteBuffer[] bufs, int offset, int length) throws IOException {
     long totalRead = 0;
     try
     {
         for (int i = offset; i < offset + length; i++)
         {
             int size = bufs[i].remaining();
             if (size > 0)
             {
                 int read = IOUtil.read(fd, bufs[i], -1, this, this);
                 if (read < 0)
                 {
                     break;
                 }
                 totalRead += read;
                 if (read < size || fd.available() == 0)
                 {
                     break;
                 }
             }
         }
     }
     catch (IOException x)
     {
         if (totalRead == 0)
         {
             throw x;
         }
     }
     return totalRead;
 }