日期:2014-05-20  浏览次数:20676 次

NIO里面FileChannel的read/write方法很有误导性,出于什么目的设计成这样?

FileChannel fc = FileChannel.open(Paths.get("test"),StandardOpenOption.READ,StandardOpenOption.WRITE)
ByteBuffer copy = ByteBuffer.allocate(10)


nread = fc.read(copy)

刚开始还以为是,从buffer里面读取data到FileChannel,结果是从FileChannel中读去buffer

write也一样
fc.write(copy)

按字面的理解,肯定是将FileChannel的数据写到copy这个buffer里,结果却是从buffer里读取数据到FileChannel

大家不觉得很有歧义么?

------解决方案--------------------
你去看看 InputStream#read(byte[]) 的方法,语义和 FileChannel#read(ByteBuffer) 是一样的呀,都是从流(通道)中读取数据到内存中。

同样,OutputStream#write(byte[]), FileChannel#write(ByteBuffer) 也都是将内存中的数据写入流(通道)。
------解决方案--------------------
read 可以理解为将流或通道中的数据读出来,并放到 byte[] 或者 ByteBuffer 中去
write 可以理解为将 byte[] 或者 ByteBuffer 中的数据写到流或通道中去

read() 和 read(byte[]) 这两个方法是有区别的,因为第一个方法读出来的数据只能返回,因为没有容器给他存放数据,而后面那个方法应理解为从流中将数据读出来,再放到 byte[] 中去。