Java NIO 教程(二) Channel

參考:http://ifeve.com/channels/
原文地址

目錄

Java NIO的通道類似流,但又有些不同:

  • 既可以從通道中讀取數據,又可以寫數據到通道。但流的讀寫通常是單向的。
  • 通道可以異步地讀寫。
  • 通道中的數據總是要先讀到一個Buffer,或者總是要從一個Buffer中寫入。

正如上面所說,從通道讀取數據到緩沖區(qū),從緩沖區(qū)寫入數據到通道。如下圖所示:

NIO 數據讀寫流程

Channel的實現

這些是Java NIO中最重要的通道的實現:

FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel

  • FileChannel 從文件中讀寫數據。
  • DatagramChannel 能通過UDP讀寫網絡中的數據。
  • SocketChannel 能通過TCP讀寫網絡中的數據。
  • ServerSocketChannel可以監(jiān)聽新進來的TCP連接,像Web服務器那樣。對每一個新進來的連接都會創(chuàng)建一個SocketChannel

基本的 Channel 示例

下面是一個使用FileChannel讀取數據到Buffer中的示例:

    private static void useNio(){
        RandomAccessFile aFile = null;
        try {
            aFile = new RandomAccessFile("/Users/sschen/Documents/SerialVersion.txt", "rw");
            FileChannel inChannel = aFile.getChannel();

            ByteBuffer byteBuffer = ByteBuffer.allocate(48);
            int byteReader = inChannel.read(byteBuffer);

            while (byteReader != -1) {
                System.out.println("Read:" + byteReader);
                byteBuffer.flip();

                while (byteBuffer.hasRemaining()) {
                    System.out.println((char)byteBuffer.get());
                }

                byteBuffer.clear();

                byteReader = inChannel.read(byteBuffer);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                aFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

注意 buf.flip() 的調用,首先讀取數據到Buffer,然后反轉Buffer,接著再從Buffer中讀取數據。下一節(jié)會深入講解Buffer的更多細節(jié)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java I...
    JackChen1024閱讀 7,582評論 1 143
  • 轉自 http://www.ibm.com/developerworks/cn/education/java/j-...
    抓兔子的貓閱讀 2,340評論 0 22
  • (轉載說明:本文非原創(chuàng),轉載自http://ifeve.com/java-nio-all/) Java NIO: ...
    數獨題閱讀 820評論 0 3
  • 前言: 之前的文章《Java文件IO常用歸納》主要寫了Java 標準IO要注意的細節(jié)和技巧,由于網上各種學習途徑,...
    androidjp閱讀 2,921評論 0 22
  • (轉載說明:本文非原創(chuàng),轉載自http://ifeve.com/java-nio-all/) Java NIO: ...
    柳岸閱讀 830評論 0 3