0

当我遇到这个奇怪的问题时,我正在使用 ByteBuffers 和 IntBuffers。这是代码 -

public static void main(String[] args) {
    File file = null;
    FileOutputStream fos = null;
    FileChannel fc = null;
    ByteBuffer bb = ByteBuffer.allocate(1024);
    IntBuffer ib = bb.asIntBuffer();

    ib.put(458215);
    // System.out.println(bb.getInt());  //uncomment this for the program to work flawlessly

    try {
        // Initialize with object references
        file = new File("E:/demjavafiles/text.txt");
        fos = new FileOutputStream(file);
        fc = fos.getChannel();
        System.out.println("Object refrence variables file, fos, fc initialized. Now writing to file....");
        System.out.println("before flip positon : " + bb.position()+ "\n limit: " + bb.limit());
        bb.flip();
        System.out.println("after flip positon : " + bb.position()+ "\n limit: " + bb.limit());

        fc.write(bb);// write buffer
        fc.close();
        System.out.println("buffer written successfully!!");

    } catch (Exception e) {
        System.outprintln("oh oh an error occured D: heres some message 'bout it.");
        e.getMessage();
        e.printStackTrace(System.out);
    } finally {

        System.out.println("End of program....");

    }

}

现在,如您所见,程序创建 aByteBuffer和 anIntBuffer并使用类的put()方法IntBuffer将 an 添加intByteBuffer4 个字节。System.out.println(bb.getInt()); 当我在 try 块语句注释之前运行程序时, 这是我的输出 -

Object reference variables file, fos, fc initialized. Now writing to file....
before flip position : 0
limit: 1024
after flip posiiton : 0
limit: 0
buffer written successfully!!
End of program....

System.out.println(bb.getInt()); 现在,当我使用未注释的语句再次运行它时, 这就是我的输出 -

458215
Object reference variables file, fos, fc initialized. Now writing to file....
before flip position : 4
limit: 1024
after flip position : 0
limit: 4
buffer written successfully!!
End of program....

那么谁能告诉我为什么会这样?

4

3 回答 3

1

bb.getInt() 将缓冲区中的位置提前四个字节(所有 java.nio 缓冲区都有一个用于相对 put 和 get 的内部位置)。使用 getInt(someIndex) - 绝对位置变量 - 如果您希望保持位置。

于 2014-05-07T09:45:42.060 回答
1

来自 JavaDoc

公共最终缓冲区翻转()

翻转此缓冲区。限制设置为当前位置,然后位置设置为零。如果标记已定义,则将其丢弃。

在从缓冲区读取任何内容之前,位置 == 0,限制 ==0。所以翻转后,位置== 0,限制== 0。

当你getInt(),位置增加4。所以位置== 4,限制== 0。然后flip()按照JavaDoc的说法:位置== 0,限制== 4。

于 2014-05-07T09:49:46.907 回答
0

您在同一数据上维护两个不同的缓冲区,并且它们的位置不同,因此当您写入一个缓冲区时,它不会改变另一个缓冲区的位置。

我建议您在调试器中单步执行您的代码,看看发生了什么。

我就是这样写的。

public static void main(String... ignored) throws IOException {
    try (FileChannel fc = new FileOutputStream("binary.data").getChannel()) {
        ByteBuffer bb = ByteBuffer.allocate(1024);
        bb.putInt(458215);
        bb.flip();
        fc.write(bb);
        System.out.println("File has " + fc.size() + " bytes in it");
    }
}

印刷

File has 4 bytes in it
于 2014-05-07T09:59:14.680 回答