1 回答

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
出現(xiàn)問(wèn)題的原因是您從未重置緩沖區(qū)的位置。
當(dāng)您創(chuàng)建兩個(gè)ByteBuffer
對(duì)象時(shí),它們從位置零開(kāi)始。每當(dāng)您向其中添加內(nèi)容時(shí),它們的位置都會(huì)前進(jìn),這意味著當(dāng)您嘗試將它們寫(xiě)出時(shí),它們會(huì)報(bào)告沒(méi)有更多字節(jié)可供讀取。因此,在進(jìn)行任何此類(lèi)操作之前,您需要以某種方式重置它們的位置。
Buffer
提供了幾種最容易使用的方法flip()
。正如您在此處的文檔中所見(jiàn),其用法如下:
翻轉(zhuǎn)這個(gè)緩沖區(qū)。將限制設(shè)置為當(dāng)前位置,然后將位置設(shè)置為零。如果定義了標(biāo)記,則將其丟棄。
在一系列通道讀取或放置操作之后,調(diào)用此方法以準(zhǔn)備一系列通道寫(xiě)入或相關(guān)獲取操作
因此,在寫(xiě)出它們之前,您需要翻轉(zhuǎn)它們。此外,由于您正在試驗(yàn),java.nio
我不明白為什么您不應(yīng)該使用try with resources
語(yǔ)句來(lái)管理您的各種資源。這樣,您將避免關(guān)閉可以手動(dòng)自動(dòng)關(guān)閉的資源的過(guò)多樣板代碼。
使用這些你的代碼可以顯著縮小并且更具可讀性:
public static void gather() {
ByteBuffer header = ByteBuffer.allocate(10);
ByteBuffer body = ByteBuffer.allocate(10);
byte[] b1 = { '0', '1' };
byte[] b2 = { '2', '3' };
header.put(b1);
body.put(b2);
//flip buffers before writing them out.
header.flip();
body.flip();
ByteBuffer[] buffs = { header, body };
try(FileOutputStream os = new FileOutputStream("d:/scattingAndGather.txt");
FileChannel channel = os.getChannel()) {
channel.write(buffs);
} catch (IOException e) {
e.printStackTrace();
}
}
添加回答
舉報(bào)