FileChannel 不写任何东西

Posted

技术标签:

【中文标题】FileChannel 不写任何东西【英文标题】:FileChannel doesn't write anything 【发布时间】:2014-06-23 14:00:02 【问题描述】:

我必须按小端顺序写一个整数。所以我创建了一个类(这个类没有扩展任何东西),它有一个 FileChannel 属性和一些写方法。

但有一个问题:只有一种方法有效,另一种无效!

这里是工作方法(dis是FileChannel):

public void writeBuffer(ByteArrayOutputStream t) throws IOException

    ByteBuffer buffer=ByteBuffer.wrap(t.toByteArray());
    dis.write(buffer);

这是一种不起作用的写入方法:

public void writeInt(int t) throws IOException

    ByteBuffer buffer=ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN);
    buffer.putInt(t);
    dis.write(buffer);

我调试了程序,dis.write(buffer)返回0,怎么回事?

有没有人知道用 little endian 写入 4 字节整数的替代方法?

【问题讨论】:

如果我没记错的话你需要flip the buffer。 Guava 有一些 little-endian 流。 不,我在调试器上检查过,顺序是正确的... flip 不会影响字节顺序 - 它会将缓冲区从写入切换到读取。 天哪!有用!但是为什么这里我必须翻转缓冲区而不是 writeBuffer() 方法呢? 尝试this 使用 FileChannel 将数据写入文件。 【参考方案1】:

当您创建一个 ByteBuffer(例如使用ByteBuffer.wrapByteBuffer.allocate)时,它的创建位置为零。在第二种方法中,您调用 putInt,它将 ByteBuffer 的位置提升到 4(缓冲区的末尾),因此 ByteBuffer 报告没有更多字节要读取。

有许多方法可以重置缓冲区的位置。正如 cmets 所说,flip 可能是最佳选择,因为它专门用于在您将数据放入缓冲区并希望其他代码开始读取该数据时调用。

【讨论】:

以上是关于FileChannel 不写任何东西的主要内容,如果未能解决你的问题,请参考以下文章

public公共的,意思是任何东西都可以访问public修饰的东西!那不写可以吗?

Java NIO FileChannel 与 FileOutputstream 性能/实用性

Netty——FileChannel中方法说明与代码示例

Netty——FileChannel中方法说明与代码示例

Java NIO系列教程 FileChannel

FileChannel指南