FileChannel不写入任何东西。

3
我需要按小端序写入一个整数。因此,我创建了一个类(该类不继承任何东西),其中包含一个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,那么出了什么问题呢?

有人知道以小端模式写入 4 字节整数的替代方法吗?


1
如果我没记错的话,你需要翻转缓冲区。Guava有一些小端流。 - McDowell
不,我在调试器上检查过了,顺序是正确的... - Matteo Iervasi
flip 不会影响字节序,它将缓冲区从写模式切换到读模式。 - McDowell
1
天哪!它运行了!但为什么我在这里必须翻转缓冲区而不是在writeBuffer()方法中呢? - Matteo Iervasi
尝试使用这个链接来使用FileChannel将数据写入文件。 - Ajay Kumar
1个回答

3
当你创建一个ByteBuffer(比如使用ByteBuffer.wrapByteBuffer.allocate),它的位置会被创建在0处。在第二种方法中,你调用了putInt,这会将ByteBuffer的位置移动到4(缓冲区末尾),所以ByteBuffer报告没有更多字节可读。
有许多方法可以重置缓冲区的位置。正如评论所述,flip可能是最好的选择,因为它专门用于在将数据放入缓冲区并希望其他代码开始读取该数据时调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接