<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java 標準 IO 與 Java NIO > 原文: [https://howtodoinjava.com/java/io/difference-between-standard-io-and-nio/](https://howtodoinjava.com/java/io/difference-between-standard-io-and-nio/) JDK 1.4 引入了[**新輸入/輸出(NIO)**](//howtodoinjava.com/category/java-7-features/nio/ "NIO")庫。 從原始 I/O 遺留的地方接起,NIO 用標準 Java 代碼提供了高速,面向塊的 I/O。 通過定義用于保存數據的類,并通過按塊處理該數據,NIO 可以利用低級優化的優勢,而無需使用本機代碼,原始 I/O 包就無法實現。 在本教程中,我將專注于確定最明顯的區別,在決定在下一個項目中使用哪個區別之前,您必須知道這些區別。 ## 回顧舊的 IO 機制 [**I/O(輸入/輸出)**](//howtodoinjava.com "java io") 是指計算機與世界其他地方之間的接口,或單個程序與計算機其余部分之間的接口。 單個程序通常會為他們完成大部分工作。 在 Java 編程中,直到最近才使用流隱喻來執行 I/O。 所有 I/O 都被視為單個字節通過一個稱為流的對象一次移動。 流 I/O 用于聯系外界。 它還在內部使用,用于將對象轉換為字節,然后再轉換為對象。 ## NIO 介紹 [**NIO**](//howtodoinjava.com/java-nio-tutorials/ "NIO Tutorials") 的創建是為了使 Java 程序員無需編寫自定義本機代碼即可實現高速 I/O。 NIO 將最耗時的 I/O 活動(即填充和清空緩沖區)移回到操作系統中,從而大大提高了速度。 如果以上介紹讓您感到口渴,請不要擔心,在我們前進的過程中您是否會感到更好。 讓我們從發現差異開始。 ## 識別 IO 和 NIO 之間的差異 ##### 1)IO 流與 NIO 塊 原始 I/O 庫(可在`java.io.*`中找到)和 NIO 之間最重要的區別與數據的打包和傳輸方式有關。 如前所述,原始 I/O 處理流中的數據,而 NIO 處理塊中的數據。 面向流的 I/O 系統一次處理一個或多個字節的數據。 輸入流產生一個字節的數據,而輸出流消耗一個字節的數據。 為流數據創建過濾器非常容易。 將幾個過濾器鏈接在一起也是相對簡單的,這樣每個過濾器都能發揮自己的作用,相當于一個單一的復雜處理機制。 重要的是字節不會在任何地方緩存。 此外,您不能在流中的數據中來回移動。 如果需要來回移動從流中讀取的數據,則必須先將其緩存在緩沖區中。 面向塊的 I/O 系統按塊處理數據。 每個操作一步就產生或消耗一個數據塊。 通過塊處理數據可能比通過(流式傳輸)字節處理數據快得多。 您可以根據需要在緩沖區中來回移動。 這使您在處理過程中更具靈活性。 但是,您還需要檢查緩沖區是否包含您需要的所有數據,以便對其進行完全處理。 并且,您需要確保在將更多數據讀入緩沖區時,不要覆蓋尚未處理的緩沖區中的數據。 但是面向塊的 I/O 缺少面向流的 I/O 的一些優雅和簡單性。 **閱讀更多:** [**3 種使用 Java NIO 讀取文件的方法**](//howtodoinjava.com/java-7/nio/3-ways-to-read-files-using-java-nio/ "3 ways to read files using Java NIO") ##### 2)同步與異步 IO Java IO 的各種流正在阻塞或同步。 這意味著,當線程調用`read()`或`write()`時,該線程將被阻塞,直到有一些數據要讀取或數據被完全寫入為止。 在此期間,線程將處于阻塞狀態。 這被認為是在現代語言中引入多線程的一個很好的堅實理由。 在異步 IO 中,線程可以請求將某些數據寫入通道,但不等待將其完全寫入。 然后線程可以繼續運行,同時執行其他操作。 通常,這些線程將空閑時間花費在未阻塞 IO 調用上的時間,通常同時在其他通道上執行 IO。 也就是說,單個線程現在可以管理輸入和輸出的多個通道。 同步程序通常不得不訴諸于輪詢或創建許多線程來處理大量連接。 使用異步 I/O,您可以在任意數量的通道上偵聽 I/O 事件,而無需輪詢且無需額外的線程。 異步 I/O 中的中心對象稱為選擇器。 選擇器是您對各種 I/O 事件感興趣的地方,它是告訴您何時發生這些事件的對象。 因此,我們需要做的第一件事是創建一個選擇器: ```java Selector selector = Selector.open(); ``` 稍后,我們將在各種通道對象上調用` register()`方法,以使我們對那些對象內發生的 I/O 事件感興趣。 `register()`的第一個參數始終是選擇器。 **閱讀更多:[如何在 Java NIO 中定義路徑](//howtodoinjava.com/java-7/nio/how-to-define-path-in-java-nio/ "How to define Path in java NIO")** ##### 3)IO 與 NIO API 猜測使用 NIO 時 API 調用與使用 IO 時看起來不同的猜測是沒有根據的。 在 NIO 中,而不是從例如如果是`InputStream`,則必須首先將數據讀入緩沖區,然后再對其進行處理。 使用標準 IO 的示例代碼 ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class WithoutNIOExample { public static void main(String[] args) { BufferedReader br = null; String sCurrentLine = null; try { br = new BufferedReader( new FileReader("test.txt")); while ((sCurrentLine = br.readLine()) != null) { System.out.println(sCurrentLine); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) br.close(); } catch (IOException ex) { ex.printStackTrace(); } } } } ``` 使用 NIO 的示例代碼 ```java import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class ReadFileWithFixedSizeBuffer { public static void main(String[] args) throws IOException { RandomAccessFile aFile = new RandomAccessFile ("test.txt", "r"); FileChannel inChannel = aFile.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while(inChannel.read(buffer) > 0) { buffer.flip(); for (int i = 0; i < buffer.limit(); i++) { System.out.print((char) buffer.get()); } buffer.clear(); // do something with the data and clear/compact it. } inChannel.close(); aFile.close(); } } ``` ## 總結 NIO 允許您僅使用一個(或更少)線程來管理多個通道,但是代價是解析數據可能比使用標準 IO 從阻塞流中讀取數據時要復雜得多。 如果您需要同時管理數千個打開的連接(每個連接僅發送少量數據),例如聊天服務器,則在 NIO 中實現該服務器可能是一個優勢。 同樣,如果您需要保持與其他計算機的大量開放連接,例如在 P2P 網絡中,使用單個線程來管理所有出站連接可能是一個優勢。 如果您只有很少的連接且帶寬很高,那么一次發送大量數據,則應該選擇標準 IO 服務器實現。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看