第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么緩沖區(qū)沒(méi)有被寫(xiě)入 FileChannel

為什么緩沖區(qū)沒(méi)有被寫(xiě)入 FileChannel

慕田峪9158850 2021-08-25 15:26:34
我現(xiàn)在正在學(xué)習(xí)java NIO,我找到了一個(gè)例子來(lái)解釋FileChannel的收集操作,如下所示:public class ScattingAndGather {    public static void main(String args[]) {        gather();    }    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);        ByteBuffer[] buffs = { header, body };        FileOutputStream os = null;        FileChannel channel = null;        try {            os = new FileOutputStream("d:/scattingAndGather.txt");            channel = os.getChannel();            channel.write(buffs);        } catch (IOException e) {            e.printStackTrace();        } finally {            if (os != null) {                try {                    os.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if (channel != null) {                try {                    channel.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }}雖然結(jié)果顯示文件已經(jīng)創(chuàng)建,但它是空的,應(yīng)該是0123,這個(gè)例子有什么問(wèn)題?
查看完整描述

1 回答

?
至尊寶的傳說(shuō)

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();

    }

}


查看完整回答
反對(duì) 回復(fù) 2021-08-25
  • 1 回答
  • 0 關(guān)注
  • 258 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)