传图识字java_Java:全面 清晰的 NIO 学习攻略
Java:全面 & 清晰的 NIO 學習攻略
發布時間:2018-11-19 09:19,
瀏覽次數:202
, 標簽:
Java
NIO
<>前言
* JDK 1.4后,Java提供了一個全新的IO API,即 Java New IO
* 本文 全面 & 詳細解析Java New IO,希望你們會喜歡
<>目錄
<>儲備知識:Java IO
<>1. 定義
* 即 Java New IO
* 是1個全新的、 JDK 1.4后提供的 IO API
<>2. 作用
* 提供了與標準IO不同的IO工作方式
* 可替代 標準Java IO 的IO API
<>3. 新特性
對比于 Java IO,NIO具備的新特性如下
<>4. 核心組件
Java NIO的核心組件 包括:
* 通道(Channel)
* 緩沖區(Buffer)
* 選擇器(Selectors)
下面將詳細介紹:
<>5. 具體使用
<>5.1 基于通道 & 緩沖數據
具體步驟如下:
// 1. 獲取數據源 和 目標傳輸地的輸入輸出流(此處以數據源 = 文件為例) FileInputStream fin = new
FileInputStream(infile); FileOutputStream fout = new FileOutputStream(outfile);
// 2. 獲取數據源的輸入輸出通道 FileChannel fcin = fin.getChannel(); FileChannel fcout =
fout.getChannel(); // 3. 創建 緩沖區 對象:Buffer(共有2種方法) // 方法1:使用allocate()靜態方法
ByteBuffer buff = ByteBuffer.allocate(256); // 上述方法創建1個容量為256字節的ByteBuffer //
注:若發現創建的緩沖區容量太小,則重新創建一個大小合適的緩沖區 // 方法2:通過包裝一個已有的數組來創建 //
注:通過包裝的方法創建的緩沖區保留了被包裝數組內保存的數據 ByteBuffer buff = ByteBuffer.wrap(byteArray); //
額外:若需將1個字符串存入ByteBuffer,則如下 String sendString="你好,服務器. "; ByteBuffer sendBuff =
ByteBuffer.wrap(sendString.getBytes("UTF-16")); // 4. 從通道讀取數據 & 寫入到緩沖區 // 注:若
以讀取到該通道數據的末尾,則返回-1 fcin.read(buff); // 5. 傳出數據準備:將緩存區的寫模式 轉換->> 讀模式
buff.flip(); // 6. 從 Buffer 中讀取數據 & 傳出數據到通道 fcout.write(buff); // 7. 重置緩沖區 //
目的:重用現在的緩沖區,即 不必為了每次讀寫都創建新的緩沖區,在再次讀取之前要重置緩沖區 // 注:不會改變緩沖區的數據,只是重置緩沖區的主要索引值
buff.clear();
<>5.2 基于選擇器(Selecter)
具體步驟如下:
// 1. 創建Selector對象 Selector sel = Selector.open(); // 2. 向Selector對象綁定通道 // a.
創建可選擇通道,并配置為非阻塞模式 ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false); // b. 綁定通道到指定端口 ServerSocket socket =
server.socket(); InetSocketAddress address = new InetSocketAddress(port);
socket.bind(address); // c. 向Selector中注冊感興趣的事件 server.register(sel,
SelectionKey.OP_ACCEPT); return sel; // 3. 處理事件 try { while(true) { //
該調用會阻塞,直到至少有一個事件就緒、準備發生 selector.select(); // 一旦上述方法返回,線程就可以處理這些事件
Set keys = selector.selectedKeys(); Iterator iter =
keys.iterator(); while (iter.hasNext()) { SelectionKey key = (SelectionKey)
iter.next(); iter.remove(); process(key); } } } catch (IOException e) {
e.printStackTrace(); }
<>6. 實例講解
* 實例說明:實現文件復制功能
* 實現方式:通道FileChannel、 緩沖區ByteBuffer import java.io.FileInputStream; import
java.io.FileOutputStream; import java.io.IOException; import
java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class Test {
public static void main(String[] args) throws IOException { // 設置輸入源 & 輸出地 = 文件
String infile = "C:\\copy.sql"; String outfile = "C:\\copy.txt"; // 1. 獲取數據源 和
目標傳輸地的輸入輸出流(此處以數據源 = 文件為例) FileInputStream fin = new FileInputStream(infile);
FileOutputStream fout = new FileOutputStream(outfile); // 2. 獲取數據源的輸入輸出通道
FileChannel fcin = fin.getChannel(); FileChannel fcout = fout.getChannel(); //
3. 創建緩沖區對象 ByteBuffer buff = ByteBuffer.allocate(1024); while (true) { // 4.
從通道讀取數據 & 寫入到緩沖區 // 注:若 以讀取到該通道數據的末尾,則返回-1 int r = fcin.read(buff); if (r ==
-1) { break; } // 5. 傳出數據準備:調用flip()方法 buff.flip(); // 6. 從 Buffer 中讀取數據 &
傳出數據到通道 fcout.write(buff); // 7. 重置緩沖區 buff.clear(); } } }
<>7. 與Java IO的區別
<>8. 總結
* 本文全面講解了Java中的NIO的相關知識
* 下面我將繼續對 Android & Java中的知識進行深入講解 ,有興趣可以繼續關注Carson_Ho的安卓開發筆記
<>請幫頂 / 評論點贊!因為你的鼓勵是我寫作的最大動力!
總結
以上是生活随笔為你收集整理的传图识字java_Java:全面 清晰的 NIO 学习攻略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【神经网络】LSTM理论介绍
- 下一篇: x3-02 java_Day13 --