NIO系列1:Channel的理解

本文參考至:http://ifeve.com/channels/

其實(shí)可以將Channel理解為流幕屹,不同的地方在于:

   1. Channel既可以從中讀取數(shù)據(jù)蓝角,又可以寫(xiě)數(shù)據(jù)到Channel。但流的讀寫(xiě)通常是單向的罢屈。
   2. Channel可以異步地讀寫(xiě)。
   3. Channel中的數(shù)據(jù)總是要先讀到一個(gè)Buffer篇亭,或者總是要從一個(gè)Buffer中寫(xiě)入缠捌。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * NIO中FileChannle的創(chuàng)建
 * Channel的理解
 * @2017-3-21
 */
public class FileChannleMake {
    public static void main(String[] args) throws IOException {
        // 獲取文件對(duì)象
        File file = new File("F:/jia.txt");
        // 將文件對(duì)象轉(zhuǎn)為流的形式
        FileInputStream fileInput = new FileInputStream(file);
        // 將輸入流轉(zhuǎn)為channel對(duì)象
        FileChannel fileChannel = fileInput.getChannel();
        // 用于保存從channel讀取到的數(shù)據(jù),最大容量:48bytes
        ByteBuffer byteBuffer = ByteBuffer.allocate(48);
        // 從文件中讀寫(xiě)數(shù)據(jù)译蒂,下面這行代碼表示從該通道讀取一個(gè)字節(jié)序列到給定的緩沖區(qū)曼月。通道是可以異步讀寫(xiě)的!H嶂纭哑芹!
        // 每次從通道讀48個(gè)字節(jié)到byteBuffer中,讀過(guò)的數(shù)據(jù)不能再讀
        int bytesRead = fileChannel.read(byteBuffer);
        while (bytesRead != -1) {
            byteBuffer.flip();
            while (byteBuffer.hasRemaining()) {
                System.out.print((char) byteBuffer.get());
            }
            System.out.println(" ----read " + bytesRead);
            byteBuffer.clear();
            // 當(dāng)byteBuffer全部讀出后捕透,又會(huì)繼續(xù)從channel讀數(shù)據(jù)到byteBuffer中聪姿,直到讀完channel中的數(shù)據(jù)
            bytesRead = fileChannel.read(byteBuffer);
        }

        //通過(guò)下面的代碼,可以清晰的發(fā)現(xiàn)乙嘀。FileChannel中的數(shù)據(jù)只要讀出之后就會(huì)被刪掉
        ByteBuffer byteBuffer1 = ByteBuffer.allocate(48);
        int bytesRead1 = fileChannel.read(byteBuffer);
        System.out.println("ssssssssss" + bytesRead1);
        while (bytesRead1 != -1) {
            System.out.println("ssssssssssasasas----end" + bytesRead1);
            byteBuffer1.flip();
            while (byteBuffer.hasRemaining()) {
                System.out.print((char) byteBuffer1.get());
            }
            System.out.println(" ----read " + bytesRead1);
            byteBuffer.clear();
            bytesRead1 = fileChannel.read(byteBuffer);
        }
    }
}

讀者可以嘗試看看然后運(yùn)行上面的代碼末购。

這里簡(jiǎn)單介紹一下FileChannel
Java NIO中的FileChannel是一個(gè)連接到文件的通道』⑿唬可以通過(guò)文件通道讀寫(xiě)文件盟榴。在使用FileChannel之前,必須先打開(kāi)它婴噩。但是擎场,我們無(wú)法直接打開(kāi)一個(gè)FileChannel,需要通過(guò)使用一個(gè)InputStream讳推、OutputStream或RandomAccessFile來(lái)獲取一個(gè)FileChannel實(shí)例顶籽。(上面例子我是通過(guò)FileInputStream 來(lái)獲取FileChannel的)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市银觅,隨后出現(xiàn)的幾起案子礼饱,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镊绪,死亡現(xiàn)場(chǎng)離奇詭異匀伏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蝴韭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)够颠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人榄鉴,你說(shuō)我怎么就攤上這事履磨。” “怎么了庆尘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵剃诅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我驶忌,道長(zhǎng)矛辕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任付魔,我火速辦了婚禮聊品,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘几苍。我一直安慰自己翻屈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布妻坝。 她就那樣靜靜地躺著妖胀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惠勒。 梳的紋絲不亂的頭發(fā)上赚抡,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音纠屋,去河邊找鬼涂臣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛售担,可吹牛的內(nèi)容都是我干的赁遗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼族铆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岩四!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哥攘,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤剖煌,失蹤者是張志新(化名)和其女友劉穎材鹦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體耕姊,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桶唐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茉兰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尤泽。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖规脸,靈堂內(nèi)的尸體忽然破棺而出坯约,到底是詐尸還是另有隱情,我是刑警寧澤莫鸭,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布鬼店,位于F島的核電站,受9級(jí)特大地震影響黔龟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滥玷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一氏身、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惑畴,春花似錦蛋欣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至杠袱,卻和暖如春尚猿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背楣富。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工凿掂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纹蝴。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓庄萎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親塘安。 傳聞我的和親對(duì)象是個(gè)殘疾皇子糠涛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Java NIO(New IO)是從Java 1.4版本開(kāi)始引入的一個(gè)新的IO API,可以替代標(biāo)準(zhǔn)的Java I...
    JackChen1024閱讀 7,555評(píng)論 1 143
  • 轉(zhuǎn)自 http://www.ibm.com/developerworks/cn/education/java/j-...
    抓兔子的貓閱讀 2,306評(píng)論 0 22
  • (轉(zhuǎn)載說(shuō)明:本文非原創(chuàng)兼犯,轉(zhuǎn)載自http://ifeve.com/java-nio-all/) Java NIO: ...
    數(shù)獨(dú)題閱讀 807評(píng)論 0 3
  • (轉(zhuǎn)載說(shuō)明:本文非原創(chuàng),轉(zhuǎn)載自http://ifeve.com/java-nio-all/) Java NIO: ...
    柳岸閱讀 818評(píng)論 0 3
  • 引言:NIO是Java面試中老生常談的一個(gè)話題锉罐,No-Block-IO(非阻塞IO)帆竹;今天專(zhuān)花了一天時(shí)間將并發(fā)變成...
    cp_insist閱讀 472評(píng)論 0 0