faster with SeekableByteChannel(s)