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; }