最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java IO和NIO的基本概念和API詳解

 更新時間:2025年03月11日 16:33:49   作者:冰糖心書房  
JavaIO是基于流的阻塞式I/O,適用于低并發(fā)場景;JavaNIO是基于通道和緩沖區(qū)的非阻塞式I/O,適用于高并發(fā)場景

一、 Java IO (Blocking IO)

基本概念

  • Java IO 是 Java 平臺提供的用于進行輸入和輸出操作的 API。
  • Java IO 基于 流 (Stream) 的模型,數(shù)據(jù)像水流一樣從一個地方流向另一個地方。
  • Java IO 主要是 阻塞式 I/O (Blocking I/O),即線程在執(zhí)行 I/O 操作時會被阻塞,直到操作完成。
  • 傳統(tǒng)IO指的是java.io包下的部分組件(File, InputStream, OutputStream, Reader, Writer)。

IO 流的分類

按數(shù)據(jù)傳輸方向:

  • 輸入流 (Input Stream): 用于從數(shù)據(jù)源讀取數(shù)據(jù)(例如,從文件、網(wǎng)絡(luò)連接、鍵盤等)。 以 InputStreamReader 作為基類。
  • 輸出流 (Output Stream): 用于將數(shù)據(jù)寫入到目標(例如,寫入到文件、網(wǎng)絡(luò)連接、控制臺等)。 以 OutputStreamWriter 作為基類。

按數(shù)據(jù)傳輸單位:

  • 字節(jié)流 (Byte Stream): 以字節(jié) (8 bits) 為單位進行數(shù)據(jù)傳輸。 以 InputStreamOutputStream 作為基類。 適用于處理二進制數(shù)據(jù)(例如,圖片、音頻、視頻等)。
  • 字符流 (Character Stream): 以字符 (16 bits) 為單位進行數(shù)據(jù)傳輸。 以 ReaderWriter 作為基類。 適用于處理文本數(shù)據(jù)。

核心類和接口

InputStream (字節(jié)輸入流):

  • FileInputStream: 從文件中讀取字節(jié)。
  • ByteArrayInputStream: 從字節(jié)數(shù)組中讀取字節(jié)。
  • ObjectInputStream: 從對象流中讀取對象。
  • BufferedInputStream: 帶緩沖的字節(jié)輸入流,提高讀取效率。

OutputStream (字節(jié)輸出流):

  • FileOutputStream: 向文件中寫入字節(jié)。
  • ByteArrayOutputStream: 向字節(jié)數(shù)組中寫入字節(jié)。
  • ObjectOutputStream: 向?qū)ο罅髦袑懭雽ο蟆?/li>
  • BufferedOutputStream: 帶緩沖的字節(jié)輸出流,提高寫入效率。

Reader (字符輸入流):

  • FileReader: 從文件中讀取字符。
  • CharArrayReader: 從字符數(shù)組中讀取字符。
  • BufferedReader: 帶緩沖的字符輸入流,提高讀取效率。
  • InputStreamReader: 將字節(jié)輸入流轉(zhuǎn)換為字符輸入流(需要指定字符編碼)。

Writer (字符輸出流):

  • FileWriter: 向文件中寫入字符。
  • CharArrayWriter: 向字符數(shù)組中寫入字符。
  • BufferedWriter: 帶緩沖的字符輸出流,提高寫入效率。
  • OutputStreamWriter: 將字節(jié)輸出流轉(zhuǎn)換為字符輸出流(需要指定字符編碼)。
  • File: 表示文件或目錄的抽象表示。

IO 操作流程 (以讀取文件為例)

  1. 創(chuàng)建 File 對象: 指定要讀取的文件路徑。
  2. 創(chuàng)建 FileInputStream 對象:File 對象作為參數(shù)傳遞給 FileInputStream 的構(gòu)造方法,創(chuàng)建一個 FileInputStream 對象。
  3. 創(chuàng)建 BufferedInputStream 對象 (可選):FileInputStream 對象作為參數(shù)傳遞給 BufferedInputStream 的構(gòu)造方法,創(chuàng)建一個 BufferedInputStream 對象,提高讀取效率。
  4. 讀取數(shù)據(jù): 使用 read() 方法從輸入流中讀取數(shù)據(jù)。
  5. 關(guān)閉流: 在完成讀取操作后,務(wù)必關(guān)閉輸入流,釋放資源(先關(guān)閉 BufferedInputStream,再關(guān)閉 FileInputStream)。

代碼示例 (讀取文件內(nèi)容):

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class IOExample {
    public static void main(String[] args) {
        File file = new File("test.txt"); // 替換為你的文件路徑

        try (FileInputStream fis = new FileInputStream(file);
             BufferedInputStream bis = new BufferedInputStream(fis)) { // 使用 try-with-resources 語句,自動關(guān)閉流

            byte[] buffer = new byte[1024];
            int bytesRead;

            while ((bytesRead = bis.read(buffer)) != -1) {
                // 處理讀取到的數(shù)據(jù)
                String data = new String(buffer, 0, bytesRead);
                System.out.print(data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

二、 Java NIO (Non-blocking IO)

基本概念

  • Java NIO 是 Java 1.4 引入的一組新的 I/O API,旨在提供高性能、非阻塞的 I/O 操作。
  • NIO 使用 通道 (Channel)緩沖區(qū) (Buffer) 的模型,而不是流。
  • NIO 主要是 非阻塞式 I/O (Non-blocking I/O),即線程在執(zhí)行 I/O 操作時不會被阻塞,而是可以執(zhí)行其他任務(wù)。
  • NIO 使用 選擇器 (Selector) 來監(jiān)聽多個通道的事件,實現(xiàn)單線程管理多個連接。

核心組件

通道 (Channel):

  • 通道類似于流,但可以進行雙向數(shù)據(jù)傳輸(既可以讀取數(shù)據(jù),也可以寫入數(shù)據(jù))。
  • 常見的通道:
    • FileChannel: 用于文件 I/O。
    • SocketChannel: 用于 TCP 網(wǎng)絡(luò) I/O (客戶端)。
    • ServerSocketChannel: 用于 TCP 網(wǎng)絡(luò) I/O (服務(wù)器端)。
    • DatagramChannel: 用于 UDP 網(wǎng)絡(luò) I/O。

緩沖區(qū) (Buffer):

  • 緩沖區(qū)是用于存儲數(shù)據(jù)的容器,本質(zhì)上是一個字節(jié)數(shù)組 (ByteBuffer) 或字符數(shù)組 (CharBuffer)。
  • NIO 使用緩沖區(qū)進行數(shù)據(jù)傳輸,而不是直接從通道讀取數(shù)據(jù)或向通道寫入數(shù)據(jù)。
  • 常見的緩沖區(qū):
    • ByteBuffer: 字節(jié)緩沖區(qū)。
    • CharBuffer: 字符緩沖區(qū)。
    • ShortBuffer: 短整型緩沖區(qū)。
    • IntBuffer: 整型緩沖區(qū)。
    • LongBuffer: 長整型緩沖區(qū)。
    • FloatBuffer: 浮點型緩沖區(qū)。
    • DoubleBuffer: 雙精度浮點型緩沖區(qū)。

選擇器 (Selector):

  • 選擇器允許單個線程監(jiān)聽多個通道的事件(例如連接建立、數(shù)據(jù)可讀、數(shù)據(jù)可寫等)。
  • 使用選擇器可以避免為每個連接創(chuàng)建一個線程,從而提高并發(fā)性能。

NIO 操作流程 (以讀取 SocketChannel 數(shù)據(jù)為例)

  1. 創(chuàng)建 ServerSocketChannel 監(jiān)聽客戶端連接。
  2. 創(chuàng)建 SocketChannel 接受客戶端連接。
  3. SocketChannel 注冊到 Selector 指定要監(jiān)聽的事件(例如 OP_READ, OP_WRITE, OP_CONNECT, OP_ACCEPT)。
  4. 創(chuàng)建 ByteBuffer 用于存儲讀取到的數(shù)據(jù)。
  5. 調(diào)用 selector.select() 方法: 阻塞等待有事件發(fā)生的通道。
  6. 獲取就緒的通道: selector.selectedKeys() 返回所有就緒通道的集合。
  7. 處理事件: 遍歷就緒通道的集合,根據(jù)不同的事件類型執(zhí)行相應(yīng)的操作(例如讀取數(shù)據(jù)、寫入數(shù)據(jù))。
  8. 讀取數(shù)據(jù): 調(diào)用 channel.read(buffer) 從通道讀取數(shù)據(jù)到緩沖區(qū)。
  9. 處理緩沖區(qū)數(shù)據(jù): 從緩沖區(qū)讀取數(shù)據(jù)并進行處理。
  10. 關(guān)閉通道和選擇器: 在完成操作后,務(wù)必關(guān)閉通道和選擇器,釋放資源。

代碼示例 (使用 SocketChannel 讀取數(shù)據(jù)):

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class NIOExample {
    public static void main(String[] args) throws IOException {
        // 1. 創(chuàng)建 SocketChannel
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new InetSocketAddress("www.example.com", 80));
        socketChannel.configureBlocking(false); // 設(shè)置為非阻塞模式

        // 2. 創(chuàng)建 ByteBuffer
        ByteBuffer buffer = ByteBuffer.allocate(1024);

        // 3. 從 Channel 讀取數(shù)據(jù)到 Buffer
        int bytesRead = socketChannel.read(buffer);

        while (bytesRead > 0) {
            // 切換到讀模式
            buffer.flip();

            // 4. 從 Buffer 讀取數(shù)據(jù)
            while (buffer.hasRemaining()) {
                System.out.print((char) buffer.get());
            }

            // 清空 Buffer,準備下一次讀取
            buffer.clear();
            bytesRead = socketChannel.read(buffer);
        }

        socketChannel.close();
    }
}

三、 Java IO 與 NIO 的區(qū)別

特性Java IO (Blocking IO)Java NIO (Non-blocking IO)
數(shù)據(jù)傳輸方式基于流 (Stream)基于通道 (Channel) 和緩沖區(qū) (Buffer)
I/O 模型阻塞式 I/O (Blocking I/O)非阻塞式 I/O (Non-blocking I/O)
選擇器沒有有 (Selector)
API簡單易用相對復(fù)雜,需要理解通道、緩沖區(qū)、選擇器等概念
性能性能較低 (高并發(fā)下)性能較高 (高并發(fā)下)
線程模型通常使用多線程模型 (每個連接一個線程)通常使用單線程多路復(fù)用模型 (一個線程管理多個連接)
適用場景低并發(fā)、連接數(shù)較少的應(yīng)用,或者可以接受阻塞的場景高并發(fā)、連接數(shù)較多的應(yīng)用,需要高性能和非阻塞的場景,例如網(wǎng)絡(luò)服務(wù)器、聊天服務(wù)器等

四、 選擇哪種 I/O 模式?

  • 如果你的應(yīng)用是低并發(fā)、連接數(shù)較少,并且可以接受阻塞,那么 Java IO 仍然是一個不錯的選擇,因為它簡單易用。
  • 如果你的應(yīng)用是高并發(fā)、連接數(shù)較多,并且對性能要求很高,那么應(yīng)該使用 Java NIO。
  • 一般情況建議直接使用NIO模型,性能更好。

總結(jié)

Java IO 和 NIO 都是 Java 平臺提供的用于進行輸入和輸出操作的 API。

Java IO 基于流的模型,使用簡單但性能較低; Java NIO 基于通道和緩沖區(qū)的模型,提供高性能、非阻塞的 I/O 操作。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Hibernate之環(huán)境搭建及demo分享

    Hibernate之環(huán)境搭建及demo分享

    下面小編就為大家分享一篇Hibernate之環(huán)境搭建及demo,具有很好的參考價值,希望對大家有所幫助
    2017-11-11
  • springmvc請求轉(zhuǎn)發(fā)和重定向問題(攜帶參數(shù)和不攜帶參數(shù))

    springmvc請求轉(zhuǎn)發(fā)和重定向問題(攜帶參數(shù)和不攜帶參數(shù))

    這篇文章主要介紹了springmvc請求轉(zhuǎn)發(fā)和重定向問題(攜帶參數(shù)和不攜帶參數(shù)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 一篇文章帶你認識Java8接口的默認方法

    一篇文章帶你認識Java8接口的默認方法

    這篇文章主要給大家介紹了如何通過一篇文章帶你認識Java8接口的默認方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java8具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • 分享Spring Boot 3.x微服務(wù)升級歷程

    分享Spring Boot 3.x微服務(wù)升級歷程

    Spring Boot 3.0.0 GA版已經(jīng)發(fā)布,好多人也開始嘗試升級,有人測試升級后,啟動速度確實快了不少,這篇文章主要介紹了Spring Boot 3.x微服務(wù)升級經(jīng)歷,需要的朋友可以參考下
    2022-12-12
  • Eureka源碼核心類預(yù)備知識

    Eureka源碼核心類預(yù)備知識

    這篇文章主要為大家介紹了Eureka源碼核心類預(yù)備知識詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • SpringBoot集成Neo4j的詳細教程

    SpringBoot集成Neo4j的詳細教程

    Spring Boot 提供了對 Neo4j 的良好支持,使得開發(fā)者可以更方便地使用圖數(shù)據(jù)庫,通過使用 Spring Data Neo4j,開發(fā)者可以輕松地進行數(shù)據(jù)訪問、操作以及管理,本文將詳細介紹如何在 Spring Boot 應(yīng)用中集成 Neo4j,需要的朋友可以參考下
    2024-11-11
  • SpringBoot集成mqtt的多模塊項目配置詳解

    SpringBoot集成mqtt的多模塊項目配置詳解

    這篇文章主要介紹了SpringBoot集成mqtt的多模塊項目配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Java插入JSON對象到PostgreSQL的步驟詳解

    Java插入JSON對象到PostgreSQL的步驟詳解

    在現(xiàn)代軟件開發(fā)中,由于?JSON?數(shù)據(jù)的輕量和通用性,處理?JSON?數(shù)據(jù)已經(jīng)變得無處不在,PostgreSQL?憑借其對?JSON?的強大支持,為存儲和查詢?JSON?數(shù)據(jù)提供了出色的平臺,本文給大家介紹了Java插入JSON對象到PostgreSQL的步驟,需要的朋友可以參考下
    2024-11-11
  • Java解決線程安全的兩種方式分享

    Java解決線程安全的兩種方式分享

    這篇文章主要為大家詳細介紹了Java中兩種常用的解決線程安全的方式——Synchornized和Lock,文中的示例代碼簡潔易懂,快跟隨小編一起學習起來吧
    2023-06-06
  • 詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置

    詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置

    本篇文章主要介紹了詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03

最新評論

阜阳市| 宁化县| 张北县| 喜德县| 洛隆县| 周宁县| 班玛县| 西峡县| 晋州市| 武冈市| 天水市| 兴义市| 青铜峡市| 滦南县| 长沙市| 理塘县| 东港市| 杨浦区| 兴化市| 沂水县| 托克逊县| 玉门市| 兰西县| 邯郸县| 延庆县| 海阳市| 玉林市| 黑水县| 蒲城县| 渑池县| 洪泽县| 康定县| 土默特左旗| 会东县| 丰城市| 巴青县| 大余县| 平阳县| 来凤县| 山东| 大英县|