欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中處理I/O操作的不同方式

 更新時間:2024年02月07日 09:52:08   作者:IT小輝同學  
BIO、NIO和AIO是Java中處理I/O操作的三種不同方式,它們分別代表阻塞I/O、非阻塞I/O和異步I/O,本文我們結合代碼進行一個綜合演示,代碼由于是偽代碼,可能存在不足,僅供大家參考

Java中處理I/O操作的不同方式:BIO,NIO,AIO

首先,我們需要知道,Java中處理I/O操作的不同方式的不同方式有幾種。

BIO、NIO和AIO是Java中處理I/O操作的三種不同方式,它們分別代表阻塞I/O、非阻塞I/O和異步I/O。下面是對它們的詳細介紹,在這里我們結合代碼進行一個綜合演示,代碼由于是偽代碼,可能存在不足,僅供大家參考:

BIO(Blocking I/O)阻塞I/O:

  • 特點: 在阻塞I/O中,當一個線程在進行I/O操作時,它會被阻塞,直到操作完成。這意味著當一個線程在讀取或寫入數(shù)據時,它無法執(zhí)行其他任務,直到I/O操作完成。

  • 適用場景: 適用于連接數(shù)較少且連接時間較長的情況,例如傳統(tǒng)的Socket編程。

  • 代碼演示:

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class BlockingIOServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);

        while (true) {
            Socket clientSocket = serverSocket.accept(); // 阻塞等待客戶端連接
            InputStream inputStream = clientSocket.getInputStream();
            // 處理輸入流,阻塞直到數(shù)據可讀
            int data = inputStream.read();
            System.out.println("Received data: " + data);

            // 其他業(yè)務邏輯處理
        }
    }
}

NIO(Non-blocking I/O)非阻塞I/O:

  • 特點: NIO引入了通道(Channel)和緩沖區(qū)(Buffer)的概念,以及選擇器(Selector)來實現(xiàn)非阻塞I/O。在非阻塞I/O中,一個線程可以管理多個通道,通過選擇器監(jiān)視這些通道的狀態(tài),當一個通道可讀或可寫時,線程可以切換到其他任務,而不需要等待I/O操作完成。

  • 適用場景: 適用于連接數(shù)較多但每個連接的交互時間短的情況,例如網絡編程中的聊天室。

  • 代碼演示:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class NonBlockingIOServer {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(8888));
        serverSocketChannel.configureBlocking(false);

        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            selector.select();
            Set<SelectionKey> selectedKeys = selector.selectedKeys();
            Iterator<SelectionKey> keyIterator = selectedKeys.iterator();

            while (keyIterator.hasNext()) {
                SelectionKey key = keyIterator.next();

                if (key.isAcceptable()) {
                    // 處理連接
                    SocketChannel clientChannel = serverSocketChannel.accept();
                    clientChannel.configureBlocking(false);
                    clientChannel.register(selector, SelectionKey.OP_READ);
                } else if (key.isReadable()) {
                    // 處理讀事件
                    SocketChannel clientChannel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    int bytesRead = clientChannel.read(buffer);
                    System.out.println("Received data: " + new String(buffer.array(), 0, bytesRead));

                    // 其他業(yè)務邏輯處理

                    clientChannel.close();
                }

                keyIterator.remove();
            }
        }
    }
}

AIO(Asynchronous I/O)異步I/O:

  • 特點: AIO引入了異步I/O操作,其中讀/寫請求被提交給操作系統(tǒng),而應用程序繼續(xù)執(zhí)行其他任務。當操作系統(tǒng)完成I/O操作時,會通知應用程序,這樣就實現(xiàn)了異步的I/O操作。

  • 適用場景: 適用于連接數(shù)較多且每個連接的交互時間不確定的情況,例如在高并發(fā)的網絡服務器中。

  • 代碼演示:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class AsyncIOServer {
    public static void main(String[] args) throws IOException {
        AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(8888));

        serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {
            @Override
            public void completed(AsynchronousSocketChannel clientChannel, Void attachment) {
                serverSocketChannel.accept(null, this);
                // 繼續(xù)接收下一個連接
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                clientChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
                    @Override
                    public void completed(Integer bytesRead, ByteBuffer buffer) {
                        System.out.println("Received data: " + new String(buffer.array(), 0, bytesRead));
                        // 其他業(yè)務邏輯處理
                        clientChannel.close();
                    }

                    @Override
                    public void failed(Throwable exc, ByteBuffer buffer) {
                        // 處理讀取失敗
                    }
                });
            }

            @Override
            public void failed(Throwable exc, Void attachment) {
                // 處理接受連接失敗
            }
        });

        // 阻塞主線程,保持服務端運行
        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

總的來說,BIO適用于連接數(shù)較少且連接時間較長的場景,NIO適用于連接數(shù)較多但每個連接的交互時間短的場景,而AIO適用于連接數(shù)較多且每個連接的交互時間不確定的場景。選擇合適的I/O模型取決于具體的應用需求。在Java中,NIO和AIO是在Java 1.4 和 Java 7 中引入的,分別位于java.niojava.nio.channels包中。

以上就是Java中處理I/O操作的不同方式的詳細內容,更多關于Java處理I/O操作的資料請關注腳本之家其它相關文章!

相關文章

  • SpringMVC之RequestContextHolder詳細解析

    SpringMVC之RequestContextHolder詳細解析

    這篇文章主要介紹了SpringMVC之RequestContextHolder詳細解析,正常來說在service層是沒有request的,然而直接從controlller傳過來的話解決方法太粗暴,后來發(fā)現(xiàn)了SpringMVC提供的RequestContextHolder,需要的朋友可以參考下
    2023-11-11
  • Springboot輕量級的監(jiān)控組件SpringbootAdmin

    Springboot輕量級的監(jiān)控組件SpringbootAdmin

    這篇文章主要為大家介紹了Springboot輕量級的監(jiān)控組件SpringbootAdmin使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java實現(xiàn)JWT登錄認證的示例代碼

    Java實現(xiàn)JWT登錄認證的示例代碼

    Java中我們可以使用諸如JJWT這樣的庫來生成和驗證JWT,本文主要介紹了Java實現(xiàn)JWT登錄認證的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • java &與&&的區(qū)別及實例

    java &與&&的區(qū)別及實例

    這篇文章主要介紹了java &與&&的區(qū)別的相關資料,并附簡單實例,幫助大家學習理解這部分知識,需要的朋友可以參考下
    2016-10-10
  • 簡單操作實現(xiàn)Java jsp servlet文件上傳過程解析

    簡單操作實現(xiàn)Java jsp servlet文件上傳過程解析

    這篇文章主要介紹了簡單操作實現(xiàn)Java jsp servlet文件上傳過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • token工作機制及原理附Java生成token工具類

    token工作機制及原理附Java生成token工具類

    這篇文章介紹了token工作機制及原理,內附Java生成token工具類Demo。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • struts2 中文亂碼的解決辦法分享

    struts2 中文亂碼的解決辦法分享

    這篇文章主要介紹了struts2 中文亂碼的解決辦法,需要的朋友可以參考下
    2014-02-02
  • 詳解Mybatis中javaType和ofType的區(qū)別

    詳解Mybatis中javaType和ofType的區(qū)別

    本文主要介紹了詳解Mybatis中javaType和ofType的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • SpringBoot之攔截器與過濾器解讀

    SpringBoot之攔截器與過濾器解讀

    這篇文章主要介紹了SpringBoot之攔截器與過濾器解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java排序算法中的快速排序算法實現(xiàn)

    Java排序算法中的快速排序算法實現(xiàn)

    這篇文章主要介紹了Java排序算法中的快速排序算法實現(xiàn),通過一趟排序將要排序的數(shù)據分割成獨立的兩部分,其中一部分的所有數(shù)據都比另外一部分的所有數(shù)據都要小,然后再按此方法對這兩部分數(shù)據分別進行快速排序,需要的朋友可以參考下
    2023-12-12

最新評論