Java詳解之I/O[BIO、NIO、AIO使用方法和示范代碼]

前言:

小弟能力不足,認知有限,難免考慮不全面,希望大佬能給出更好的建議,指出存在的問題和不足,在此跪謝。

IO發展史

Java中對于I/O能力的支持主要分為三個比較關鍵的階段:

BIO

第一個階段是起步階段JDK1.0 ~ JDK1.3,這個階段JDK是處于BIO階段的,也就是同步阻塞模式,該階段的類庫還非常的初級,對系統層面的一些網絡編程的API都沒有進行實現,因此這個階段的很多大型應用服務器都采用C或者C++語言來進行開發的,因為C或者C++可以直接調用操作系統提供的非阻塞I/O能力;

NIO

第二個階段從JDK1.4開始的,從JDK1.4開始,Java新增了java.nio的包,正式支持的NIO,提供了許多非阻塞I/O開發的API和類庫;

AIO

第三個階段是從JDK1.7開始的,這一次是對原來的NIO類庫進行了升級,官方稱為NIO 2.0,該版本不但強化了原來的基于I/O多路復用模型的NIO模式,同時新增了異步的AIO功能,所以也有很多人稱之為AIO。

各個IO介紹

BIO

在Java中,BIO(Blocking I/O)指的是阻塞式I/O,是一種基本的I/O模型。它的實現原理相對簡單,但在高并發場景下性能較差。下面我將詳細介紹BIO的實現原理。

  1. 阻塞式I/O
    在BIO中,當一個線程在進行I/O操作時,如果數據沒有準備好,該線程會被阻塞,直到數據準備好并被讀取或寫入。這意味著一個線程只能處理一個連接,如果有大量連接同時到來,就需要大量線程來處理,這會導致資源消耗過大。

  2. 實現原理

    • 服務端:服務端通過ServerSocket監聽客戶端的連接請求。當有連接請求到來時,服務端會創建一個新的線程來處理該連接。
    • 客戶端:客戶端通過Socket向服務端發起連接請求。一旦連接建立,客戶端和服務端之間可以進行數據的讀取和寫入。
  3. 服務端示例代碼

    思路:在服務端的代碼中,我們創建了一個固定大小的線程池,用于處理客戶端的連接請求。每當有客戶端連接時,就會將連接交給線程池中的一個線程來處理,這樣可以提高并發處理能力。同時,我們定義了一個ClientHandler類來處理客戶端的請求,這樣可以更好地組織代碼邏輯。

    這樣的設計可以更好地滿足企業級生產環境的要求,提高了系統的并發處理能力和穩定性。當然你還可以加入日志打印,更好的排查問題,但是因為這種已經過時,所以只是簡單示例。

    import java.io.*;
    import java.net.*;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;public class Server {public static void main(String[] args) {ServerSocket serverSocket = null;ExecutorService executor = Executors.newFixedThreadPool(10); // 創建一個固定大小的線程池try {serverSocket = new ServerSocket(8080);System.out.println("Server started. Waiting for client...");while (true) {// 等待客戶端連接Socket clientSocket = serverSocket.accept();System.out.println("Client connected: " + clientSocket.getRemoteSocketAddress());// 使用線程池處理客戶端請求executor.execute(new ClientHandler(clientSocket));}} catch (IOException e) {e.printStackTrace();} finally {try {if (serverSocket != null) {serverSocket.close();}executor.shutdown(); // 關閉線程池} catch (IOException e) {e.printStackTrace();}}}private static class ClientHandler implements Runnable {private Socket clientSocket;public ClientHandler(Socket clientSocket) {this.clientSocket = clientSocket;}@Overridepublic void run() {try {// 獲取輸入流BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));// 獲取輸出流PrintWriter output = new PrintWriter(clientSocket.getOutputStream(), true);// 讀取客戶端發送的數據String clientMessage = input.readLine();System.out.println("Received from client: " + clientMessage);// 向客戶端發送數據output.println("Hello, client!");// 關閉流和連接input.close();output.close();clientSocket.close();} catch (IOException e) {e.printStackTrace();}}}
    }
  4. 客戶端實例代碼實現:

    import java.io.*;
    import java.net.*;public class Client {public static void main(String[] args) {Socket socket = null;try {socket = new Socket("localhost", 8080);System.out.println("Connected to server.");// 獲取輸入流BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 獲取輸出流PrintWriter output = new PrintWriter(socket.getOutputStream(), true);// 向服務端發送數據output.println("Hello, server!");// 讀取服務端發送的數據String serverMessage = input.readLine();System.out.println("Received from server: " + serverMessage);// 關閉流和連接input.close();output.close();socket.close();} catch (IOException e) {e.printStackTrace();} finally {try {if (socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}}}
    }

  5. 適用場景
    BIO適用于連接數較少且吞吐量要求不高的場景,例如傳統的Socket通信應用。

  6. 局限性
    由于BIO的阻塞特性,它在高并發場景下表現較差,因為大量線程會因為I/O阻塞而處于等待狀態,導致資源浪費。

總的來說,BIO是一種簡單直觀的I/O模型,但在高并發場景下存在性能瓶頸。隨著業務的發展,通常會選擇更高效的NIO(Non-blocking I/O)或者AIO(Asynchronous I/O)來替代BIO。

NIO

在Java中,NIO(New I/O)是一種非阻塞I/O模型,相比于傳統的BIO(Blocking I/O),NIO具有更高的并發處理能力。下面我將詳細介紹NIO的實現原理。

  1. 非阻塞I/O
    NIO的核心是非阻塞I/O,它允許一個線程處理多個連接,當一個連接上的I/O操作不可立即完成時,線程可以去處理其他連接,而不是被阻塞。

  2. 核心組件

    • 通道(Channel):用于讀取和寫入數據,可以是文件、套接字等。
    • 緩沖區(Buffer):用于臨時存儲數據,讀取數據到緩沖區或將緩沖區中的數據寫入通道。
    • 選擇器(Selector):用于監聽多個通道的事件,例如連接就緒、讀就緒、寫就緒等。
  3. 實現原理

    • 服務端:服務端通過ServerSocketChannel監聽連接請求,一旦有連接到來,會將該連接注冊到Selector上,并監聽連接就緒事件。
    • 客戶端:客戶端通過SocketChannel向服務端發起連接請求,連接建立后也會注冊到Selector上。
  4. NIO服務器端示例代碼:
    實現思路:

    在以下代碼中,我們引入了日志打印服務,使用了Java自帶的Logger類來記錄日志。同時,我們使用了線程池來處理客戶端的連接請求和數據讀寫操作,以提高并發處理能力。對于各種可能遇到的問題,比如連接超時、網絡異常、數據讀寫異常等,我們在相應的位置進行了異常處理,并記錄了相應的日志,以便于排查和解決問題。

    這樣的設計更加符合企業級生產規范,提高了系統的并發處理能力和穩定性,并且對各種異常情況進行了處理,使得系統更加健壯可靠。

    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.*;
    import java.util.Iterator;
    import java.util.Set;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.logging.Logger;public class NIOServer {private static final Logger logger = Logger.getLogger(NIOServer.class.getName());private static final ExecutorService executor = Executors.newFixedThreadPool(10);public static void main(String[] args) {try {Selector selector = Selector.open();ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.socket().bind(new InetSocketAddress(8080));serverSocketChannel.configureBlocking(false);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();keyIterator.remove();if (key.isAcceptable()) {executor.execute(() -> handleAccept(key, selector));} else if (key.isReadable()) {executor.execute(() -> handleRead(key));}}}} catch (IOException e) {logger.severe("Error in NIO server: " + e.getMessage());}}private static void handleAccept(SelectionKey key, Selector selector) {try {ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();SocketChannel clientChannel = serverSocketChannel.accept();clientChannel.configureBlocking(false);clientChannel.register(selector, SelectionKey.OP_READ);} catch (IOException e) {logger.severe("Error in handleAccept: " + e.getMessage());}}private static void handleRead(SelectionKey key) {try {SocketChannel clientChannel = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = clientChannel.read(buffer);if (bytesRead == -1) {clientChannel.close();key.cancel();} else if (bytesRead > 0) {buffer.flip();byte[] data = new byte[bytesRead];buffer.get(data);logger.info("Received from client: " + new String(data));// 可以在這里處理接收到的數據}} catch (IOException e) {logger.severe("Error in handleRead: " + e.getMessage());}}
    }
  5. NIO客戶端的代碼:

    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.SocketChannel;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.logging.Logger;public class NIOClient {private static final Logger logger = Logger.getLogger(NIOClient.class.getName());private static final ExecutorService executor = Executors.newFixedThreadPool(10);public static void main(String[] args) {try {SocketChannel socketChannel = SocketChannel.open();socketChannel.configureBlocking(false);socketChannel.connect(new InetSocketAddress("localhost", 8080));while (!socketChannel.finishConnect()) {// 等待連接完成}executor.execute(() -> {try {String message = "Hello, server!";ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());socketChannel.write(buffer);buffer.clear();int bytesRead = socketChannel.read(buffer);if (bytesRead > 0) {buffer.flip();byte[] data = new byte[bytesRead];buffer.get(data);logger.info("Received from server: " + new String(data));// 可以在這里處理接收到的數據}} catch (IOException e) {logger.severe("Error in NIO client: " + e.getMessage());} finally {try {socketChannel.close();} catch (IOException e) {logger.severe("Error in closing socket channel: " + e.getMessage());}}});} catch (IOException e) {logger.severe("Error in NIO client: " + e.getMessage());}}
    }

  6. 適用場景
    NIO適用于高并發的網絡應用,例如Web服務器、聊天服務器等,能夠更高效地處理大量連接。

總的來說,NIO通過Selector、Channel和Buffer的組合,實現了非阻塞I/O,提高了系統的并發處理能力。然而,NIO編程相對復雜,需要處理事件的就緒狀態,因此在實際應用中通常會使用NIO框架或者基于NIO的高級框架,如Netty。

AIO

在Java中,AIO(Asynchronous I/O)是一種基于事件和回調機制的I/O模型,相比于傳統的BIO(Blocking I/O)和NIO(Non-blocking I/O),AIO更加適用于處理大量并發連接。下面我將詳細介紹AIO的實現原理。

  1. 異步I/O
    AIO的核心是異步I/O,它允許一個線程在等待數據就緒的同時繼續做其他事情,當數據就緒后通過回調機制來處理數據。這種模型相比于NIO更加靈活,因為不需要手動檢查就緒狀態,而是通過事件通知來處理。

  2. 核心組件

    • 異步通道(AsynchronousChannel):用于進行異步I/O操作,包括文件和套接字等。
    • 異步操作結果(AsynchronousResult):用于存儲異步操作的結果,可以通過回調方式獲取結果。
    • 異步處理器(AsynchronousHandler):用于處理異步操作完成后的回調。
  3. 實現原理

    • 服務端:服務端通過AsynchronousServerSocketChannel監聽連接請求,一旦有連接到來,會調用accept方法,并通過回調方式處理連接就緒事件。
    • 客戶端:客戶端通過AsynchronousSocketChannel向服務端發起連接請求,連接建立后也可以通過回調方式處理后續的讀寫操作。
  4. 簡單的AIO服務器示例代碼
    實現思路:針對企業級生產環境中高可用的通信需求,以下是一個更完善的AIO服務端和客戶端的Java代碼。該代碼考慮了各種可能遇到的問題,并給出了切實可行的異常解決方案。同時,引入了日志打印服務,使用了Java自帶的Logger類來記錄日志,并使用了線程池來處理客戶端的連接請求和數據讀寫操作,以提高并發處理能力。

    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;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    import java.util.logging.Logger;public class AIOServer {private static final Logger logger = Logger.getLogger(AIOServer.class.getName());private static final ExecutorService executor = Executors.newFixedThreadPool(10);public static void main(String[] args) {try {AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(8080));serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {@Overridepublic void completed(AsynchronousSocketChannel clientChannel, Void attachment) {serverSocketChannel.accept(null, this); // 接受下一個連接executor.execute(() -> handleRead(clientChannel));}@Overridepublic void failed(Throwable exc, Void attachment) {logger.severe("Error in accepting connection: " + exc.getMessage());}});// 阻止主線程退出Thread.currentThread().join();} catch (IOException | InterruptedException e) {logger.severe("Error in AIO server: " + e.getMessage());}}private static void handleRead(AsynchronousSocketChannel clientChannel) {ByteBuffer buffer = ByteBuffer.allocate(1024);clientChannel.read(buffer, null, new CompletionHandler<Integer, Void>() {@Overridepublic void completed(Integer bytesRead, Void attachment) {if (bytesRead == -1) {try {clientChannel.close();} catch (IOException e) {logger.severe("Error in closing client channel: " + e.getMessage());}return;}buffer.flip();byte[] data = new byte[bytesRead];buffer.get(data);logger.info("Received from client: " + new String(data));// 可以在這里處理接收到的數據buffer.clear();clientChannel.read(buffer, null, this); // 繼續讀取數據}@Overridepublic void failed(Throwable exc, Void attachment) {logger.severe("Error in reading from client: " + exc.getMessage());}});}
    }
  5. 簡單的AIO客戶端示例代碼

    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.AsynchronousSocketChannel;
    import java.nio.channels.CompletionHandler;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.logging.Logger;public class AIOClient {private static final Logger logger = Logger.getLogger(AIOClient.class.getName());private static final ExecutorService executor = Executors.newFixedThreadPool(10);public static void main(String[] args) {try {AsynchronousSocketChannel socketChannel = AsynchronousSocketChannel.open();socketChannel.connect(new InetSocketAddress("localhost", 8080), null, new CompletionHandler<Void, Void>() {@Overridepublic void completed(Void result, Void attachment) {String message = "Hello, server!";ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());socketChannel.write(buffer, null, new CompletionHandler<Integer, Void>() {@Overridepublic void completed(Integer bytesWritten, Void attachment) {if (buffer.hasRemaining()) {socketChannel.write(buffer, null, this); // 繼續寫入數據} else {buffer.clear();socketChannel.read(buffer, null, new CompletionHandler<Integer, Void>() {@Overridepublic void completed(Integer bytesRead, Void attachment) {buffer.flip();byte[] data = new byte[bytesRead];buffer.get(data);logger.info("Received from server: " + new String(data));// 可以在這里處理接收到的數據}@Overridepublic void failed(Throwable exc, Void attachment) {logger.severe("Error in reading from server: " + exc.getMessage());}});}}@Overridepublic void failed(Throwable exc, Void attachment) {logger.severe("Error in writing to server: " + exc.getMessage());}});}@Overridepublic void failed(Throwable exc, Void attachment) {logger.severe("Error in connecting to server: " + exc.getMessage());}});// 阻止主線程退出Thread.currentThread().join();} catch (IOException | InterruptedException e) {logger.severe("Error in AIO client: " + e.getMessage());}}
    }

  6. 適用場景
    AIO適用于需要處理大量并發連接且對性能要求較高的場景,例如高性能的網絡服務器、金融交易系統等。

總的來說,AIO通過異步I/O和事件回調機制,實現了高效的并發處理能力,相比于NIO更加靈活和高效。然而,AIO在Java中的實現相對較新,需要較高的技術要求,因此在實際應用中通常會使用成熟的AIO框架或者基于AIO的高級框架。

在Java中,有一些成熟的AIO框架或者基于AIO的高級框架,它們提供了更加便捷和高效的異步I/O編程方式。以下是一些常用的框架:

  1. Netty
    Netty是一個基于NIO的高性能網絡通信框架,但它也提供了對AIO的支持。Netty的異步事件驅動模型和高度可定制的架構使得它成為構建高性能、可擴展的網絡應用程序的理想選擇。Netty提供了豐富的功能,包括TCP/UDP傳輸、HTTP編解碼、WebSocket支持等,廣泛應用于網絡服務器、分布式系統等領域。

  2. Grizzly
    Grizzly是一個基于NIO的高性能網絡框架,它提供了對AIO的支持,并且具有高度可擴展性和靈活性。Grizzly可以用于構建高性能的Web服務器、應用服務器等網絡應用。

  3. Apache MINA
    Apache MINA是一個基于NIO的網絡應用框架,它提供了對AIO的支持,并且具有良好的擴展性和靈活性。MINA可以用于構建各種類型的網絡應用,包括游戲服務器、即時通訊服務器等。

這些框架都提供了對AIO的封裝和抽象,簡化了異步I/O編程的復雜性,同時提供了豐富的功能和高性能的網絡通信能力。在實際應用中,選擇合適的框架取決于具體的需求和項目背景,但無論選擇哪個框架,都可以極大地簡化異步I/O編程的復雜性,提高開發效率和系統性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166951.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166951.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166951.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談安科瑞直流電表在印尼某基站的應用

摘要&#xff1a;本文介紹了安科瑞直流電表在印尼的應用。主要用于印尼某基站的電流電壓電能的計量&#xff0c;配合霍爾傳感器對基站進行計量。 Abstract: This article introduces the application of Acrel DC meters in base station in Indonesia.The device is measuri…

【此時不應有 \anaconda3\envs\ blenderproc \Library\ssl\cacert.pem】問題已解決

conda 創建新環境后&#xff0c;使用conda activate blenderproc命令激活環境時出現以下錯誤&#xff1a; 此時不應有 \anaconda3\envs\ blenderproc \Library\ssl\cacert.pem 其他博客里面https://blog.csdn.net/weixin_46599926/article/details/132576960解釋這個是因為co…

前端 HTML 和 JavaScript 的基礎知識有哪些?

前端開發是Web開發的一個重要領域&#xff0c;涉及到HTML&#xff08;Hypertext Markup Language&#xff09;和JavaScript兩個主要的技術。HTML用于定義網頁的結構和內容&#xff0c;而JavaScript用于實現網頁的交互和動態效果。以下是前端HTML和JavaScript的基礎知識&#xf…

如何做好測試管理崗?深度分析職業規劃

在給學生做職業規劃的時候&#xff0c;經常就有同學說&#xff1a;我以后要做管理崗&#xff01;其實對于很多剛入行的同學&#xff0c;可能說這句話的時候并沒有真正理解管理崗需要做什么事&#xff0c;以及需要具備什么樣的技能。所以&#xff0c;作為資深測試經理&#xff0…

飛翔的小鳥——Java

一、創建文件、包、類、插入圖片文件 二、app包 1、Gameapp類&#xff08;運行游戲&#xff09; package app;import main.GameFrame;public class Gameapp {public static void main(String[] args) {//游戲的入口new GameFrame();} } 三、main包 1、Barrier&#xff08…

無需外接顯示器,直接使用windows安裝樹莓派系統并可遠程桌面登錄

準備工作: 1.安裝樹莓派官方燒錄工具 raspberry pi imager 2.下載樹莓派系統鏡像(也可選擇在線下載安裝) 打開imager工具&#xff0c;選擇需要安裝包樹莓派版本 點擊"NEXT"&#xff0c;在彈出的選項中選擇編輯設置。 設置登錄名和密碼&#xff0c;已經所連接的wif…

統一用戶桌面壁紙怎么設置

統一用戶桌面壁紙的設置方法有多種&#xff0c;以下列舉兩種&#xff1a; 方法一&#xff1a;個人更換壁紙 1、右鍵桌面&#xff0c;鼠標選擇“個性化”。 2、進入個性化之后&#xff0c;單擊下面的“桌面背景”圖標。 3、點擊“瀏覽”選擇自己備好的桌面壁紙&#xff0c;點擊…

昇騰Atlas 200I DK A2實現安全帽識別

文章目錄 環境依賴編譯測試總結 環境依賴 軟件版本說明獲取方式mxVision5.0.RC2mxVision軟件包獲取方式Ascend-CANN-toolkit6.2.RC2Ascend-cann-toolkit開發套件包獲取方式Ubuntu22.04 代碼倉庫地址&#xff1a; https://gitee.com/ascend/ascend_community_projects/tree/31…

01_原理-事件循環

01_原理-事件循環 文章目錄 01_原理-事件循環一、瀏覽器的進程模型①&#xff1a;何為進程&#xff1f;②&#xff1a;何為線程&#xff1f;③&#xff1a;瀏覽器有哪些進程和線程&#xff1f; 二、渲染主線程是如何工作的&#xff1f;三、若干解釋①&#xff1a;何為異步&…

不展現報表直接打印

不展現直接打印可以考慮這么幾種方式&#xff1a;1、如果使用自帶 demo 下的 jsp&#xff0c;可以把展現報表的 div 設置為隱藏&#xff0c;點擊打印按鈕可以打印&#xff1b;如果按鈕都不想點&#xff0c;看下 toolbar.jsp 內打印按鈕的 js 函數&#xff0c;在 jsp 末尾調用一…

LaTeX引文.bib方式插入報錯 misplaced alignment tab character \end

寫latex報了個莫名的錯誤&#xff0c;找了好久才找到原因。 參考文章 簡單記錄一下 在LaTeX中&符號有特殊含義&#xff0c;不能直接寫。 直接復制生成的bibtex可能會有&&#xff0c;這種情況下可能會報錯。 解決方法就是在&符號前面加一個斜杠\一定刪除之前編譯產生…

量子計算突破云渲染資源調度!真機測試完整報告公開!

?摘要&#xff1a;在影視領域中&#xff0c;經常會涉及大量的視頻圖像渲染工作&#xff0c;而往往在這種大規模、動態渲染場景下&#xff0c;普遍存在著冗余渲染現象。究其原因在于大規模的圖像渲染通常要求在短時間內做出渲染任務的算力分配決策&#xff0c;而經典計算機無法…

【周報2023-11-24】

周報2023-11-24 本周主要工作下周工作計劃 本周主要工作 本周的話一個主要工作有&#xff1a; 前后端進行聯調接口&#xff1a; 那么目前為止的話&#xff0c;已經調通的接口 可以使用的是個人中心 歷史生成的接口 選擇新模板 新模板詳情 ps: 下周工作計劃 主要的話就是將…

金風玉露一相逢|實在智能聯手浪潮信息合力致新生成式AI產業生態

近日&#xff0c;實在智能正式加入浪潮信息元腦生態AIStore。 實在智能是一家基于AGI大模型超自動化技術&#xff0c;領跑人機協同時代的人工智能科技公司&#xff0c;以其自研垂直的“TARS&#xff08;塔斯&#xff09;大語言模型”技術、實在RPA Agent智能體數字員工產品和超…

PSP - 蛋白質真實長序列查找 PDB 結構短序列的算法

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134599076 在蛋白質結構預測的過程中&#xff0c;輸入一般是蛋白質序列(長序列)&#xff0c;預測出 PDB 三維結構&#xff0c;再和 Ground Truth …

Android:控制按鍵燈亮滅【button-backlight】

/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 1.導包 import java.io.DataOutputStream; import java.io.FileOutputStream; Handler mHandler3; 2.新建handler對象 public void init(Context context, IWindowManager windowMan…

制作linux deb安裝包

dpkg 命令命令詳解 dpkg -i手動安裝軟件包(這個命令并不能解決軟件包之前的依賴性問題),如果在安裝某一個軟件包的時候遇到了軟件依賴的問題,可以用apt-get -f install在解決信賴性這個問題.     dpkg --info “軟件包名” --列出軟件包解包后的包名稱. dpkg -l–列出當前…

java 基礎面試題——問題+答案——第1期

一、問題 在Java基礎面試中&#xff0c;面試官可能會問及一系列基礎知識&#xff0c;以確保對Java語言的核心概念和基本特性有清晰的理解。以下是一些可能的問題&#xff1a; Java基礎&#xff1a; 解釋Java的基本特性。什么是Java虛擬機&#xff08;JVM&#xff09;&#xff…

2024深圳電子展,加快粵港澳電子信息發展,重點打造“灣區經濟”

在“十四五”期間&#xff0c;中國電子信息產業面臨著新形勢和新特點。隨著國家對5G、人工智能、工業互聯網、物聯網等“新基建”的加速推進&#xff0c;以及形成“雙循環”新格局的形勢&#xff0c;新型顯示、集成電路等產業正在加速向國內轉移。這一過程不僅帶來了新的應用前…

主從復制讀寫分離?

主從復制和讀寫分離是常見的數據庫架構策略&#xff0c;它們可以提高系統的性能和可靠性。下面是一個簡單的實現方法&#xff1a; 主從復制&#xff1a; 配置主數據庫&#xff1a;在主數據庫上啟用二進制日志&#xff08;binary log&#xff09;&#xff0c;用于記錄所有修改數…