面試攻略,Java 基礎面試 100 問(十八)

JAVA IO 包

JAVA NIO

NIO 主要有三大核心部分:Channel(通道),Buffer(緩沖區), Selector。

傳統 IO 基于字節流和字 符流進行操作,而 NIO 基于 Channel 和 Buffer(緩沖區)進行操作,數據總是從通道讀取到緩沖區 中,或者從緩沖區寫入到通道中。Selector(選擇區)用于監聽多個通道的事件(比如:連接打開, 數據到達)。因此,單個線程可以監聽多個數據通道。

NIO 和傳統 IO 之間第一個最大的區別是,IO 是面向流的,NIO 是面向緩沖區的。

NIO 的緩沖區

Java IO 面向流意味著每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何 地方。此外,它不能前后移動流中的數據。如果需要前后移動從流中讀取的數據,需要先將它緩 存到一個緩沖區。NIO 的緩沖導向方法不同。數據讀取到一個它稍后處理的緩沖區,需要時可在 緩沖區中前后移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所 有您需要處理的數據。而且,需確保當更多的數據讀入緩沖區時,不要覆蓋緩沖區里尚未處理的數據。

NIO 的非阻塞

IO 的各種流是阻塞的。這意味著,當一個線程調用 read() 或 write()時,該線程被阻塞,直到有 一些數據被讀取,或數據完全寫入。該線程在此期間不能再干任何事情了。NIO 的非阻塞模式, 使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可 用時,就什么都不會獲取。而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以 繼續做其他的事情。

非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不需要等待它 完全寫入,這個線程同時可以去做別的事情。線程通常將非阻塞 IO 的空閑時間用于在其它通道上 執行 IO 操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。

Channel

首先說一下 Channel,國內大多翻譯成“通道”。Channel 和 IO 中的 Stream(流)是差不多一個 等級的。只不過 Stream 是單向的,譬如:InputStream, OutputStream,而 Channel 是雙向 的,既可以用來進行讀操作,又可以用來進行寫操作。

NIO 中的 Channel 的主要實現有:

    1. FileChannel

    1. DatagramChannel

    1. SocketChannel

    1. ServerSocketChannel

這里看名字就可以猜出個所以然來:分別可以對應文件 IO、UDP 和 TCP(Server 和 Client)。下面演示的案例基本上就是圍繞這 4 個類型的 Channel 進行陳述的。

Buffer

Buffer,故名思意,緩沖區,實際上是一個容器,是一個連續數組。Channel 提供從文件、 網絡讀取數據的渠道,但是讀取或寫入的數據都必須經由 Buffer。

上面的圖描述了從一個客戶端向服務端發送數據,然后服務端接收數據的過程。客戶端發送數據時,必須先將數據存入 Buffer 中,然后將 Buffer 中的內容寫入通道。服務端這邊接收數據必 須通過 Channel 將數據讀入到 Buffer 中,然后再從 Buffer 中取出數據來處理。

在 NIO 中,Buffer 是一個頂層父類,它是一個抽象類,常用的 Buffer 的子類有:ByteBuffer、IntBuffer、 CharBuffer、 LongBuffer、 DoubleBuffer、FloatBuffer、 ShortBuffer

Selector

Selector 類是 NIO 的核心類,Selector 能夠檢測多個注冊的通道上是否有事件發生,如果有事 件發生,便獲取事件然后針對每個事件進行相應的響應處理。這樣一來,只是用一個單線程就可 以管理多個通道,也就是管理多個連接。這樣使得只有在連接真正有讀寫事件發生時,才會調用 函數來進行讀寫,就大大地減少了系統開銷,并且不必為每個連接都創建一個線程,不用去維護 多個線程,并且避免了多線程之間的上下文切換導致的開銷。

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

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

相關文章

Linux命令(70)之bzip2

linux命令之bzip2 1.bzip2介紹 linux命令bzip2是用來壓縮或解壓縮文件名后綴為".bz2"的文件 2.bzip2用法 bzip2 [參數] filename bzip2常用參數 參數說明-d解壓縮文件-t測試壓縮文件是否正確-k壓縮后,保留源文件-z強制壓縮-f強制覆蓋已存在的文件-v顯…

TRT8系列—— 版本差異注意事項

TRT8 一個大版本,8.4-、 8.5、 8.6(包含預覽功能)卻有很多變動,一不注意就發現很混亂,特備注此貼。建議具體case可以參考這個合集,真心安利:https://github.com/NVIDIA/trt-samples-for-hackath…

Go語言GIN框架安裝與入門

Go語言GIN框架安裝與入門 文章目錄 Go語言GIN框架安裝與入門1. 創建配置環境2. 配置環境3. 下載最新版本Gin4. 編寫第一個接口5. 靜態頁面和資源文件加載6. 各種傳參方式6.1 URL傳參6.2 路由形式傳參6.3 前端給后端傳遞JSON格式6.4 表單形式傳參 7. 路由和路由組8. 項目代碼mai…

GaussDB 實驗篇+openGauss的4種1級分區案例

? 范圍分區/range分區 -- 創建表 drop table if exists zzt.par_range; create table if not exists zzt.par_range (empno integer,ename char(10),job char(9),mgr integer(4),hiredate date,sal numeric(7,2),comm numeric(7,2),deptno integer,constraint pk_par_emp pri…

除自身以外數組的乘積(c語言詳解)

題目:除自身外數組的乘積 給你一個整數數組 nums,返回 數組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據保證數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請不要使用除…

Android Studio實現解析HTML獲取圖片URL,將URL存到list,進行瀑布流展示

目錄 效果展示build.gradle(app)添加的依賴(用不上的可以不加)AndroidManifest.xml錯誤代碼activity_main.xmlitem_image.xmlMainActivityImage適配器ImageModel 接收圖片URL效果展示 build.gradle(app)添加的依賴(用不上的可以不加) dependencies {implementation co…

Android 13 像Settings一樣開啟關閉深色模式

一.背景 由于客戶定制的Settings需要開啟關閉深色模式,所以需要自己調用開啟關閉深色模式 二.前提條件 首先應用肯定要是系統應用,并且導入framework.jar包,具體可以參考: Android 應用自動開啟輔助(無障礙)功能并使用輔助(無障礙)功能_android 自動開啟無障礙服務_龔禮鵬…

Java版電子招投標管理系統源碼-電子招投標認證服務平臺-權威認證 tbms

? 功能描述 1、門戶管理:所有用戶可在門戶頁面查看所有的公告信息及相關的通知信息。主要板塊包含:招標公告、非招標公告、系統通知、政策法規。 2、立項管理:企業用戶可對需要采購的項目進行立項申請,并提交審批,…

Neo4j之CREATE基礎

在 Neo4j 中,CREATE 語句用于創建節點、關系以及節點屬性。 創建節點: CREATE (p:Person {name: John, age: 30});這個查詢會創建一個具有 "Person" 標簽的節點,節點屬性包括 "name" 和 "age"。 創建帶有關…

【java畢業設計】基于Spring Boot+Vue+mysql的論壇管理系統設計與實現(程序源碼)-論壇管理系統

基于Spring BootVuemysql的論壇管理系統設計與實現(程序源碼畢業論文) 大家好,今天給大家介紹基于Spring BootVuemysql的論壇管理系統設計與實現,本論文只截取部分文章重點,文章末尾附有本畢業設計完整源碼及論文的獲取…

創建遠程倉庫以及分支

1、 創建遠程倉庫 這里有兩種方式 1.1 利用git的插件有Gitee、GitHub。 來到 GitHub 中發現已經幫我們創建好了 gitTest 的遠程倉庫。 1.2 通過Push的方式推送本地庫到遠程庫 這種方式需要提前創建好倉庫。 右鍵點擊項目,可以將當前分支的內容 push 到 GitHub 的遠…

Python爬蟲——scrapy_工作原理

引擎向spiders要url引擎把將要爬取的url給調度器調度器會將url生成的請求對象放入到指定的隊列中從隊列中出隊一個請求引擎將請求交給下載器進行處理下載器發送請求獲取互聯網數據下載器將數據返回給引擎引擎將數據再次給到spidersspiders通過xpath解析該數據,得到數…

vue3+ts+tsx的使用與好處(語法方面:tsx==jsx)

前言: 整理分享下vue3tstsx相關的資料,有react使用經驗的小伙伴應該更能理解這個的好處,終于在vue3中也支持了,相當于函數的方法來操作界面。 1、vue3項目中為什么要用tsx(等同于我們react的jsx) 類型安全…

【STM32】 工程

🚩 WRITE IN FRONT 🚩 🔎 介紹:"謓澤"正在路上朝著"攻城獅"方向"前進四" 🔎🏅 榮譽:2021|2022年度博客之星物聯網與嵌入式開發TOP5|TOP4、2021|2022博客之星TO…

oracle 更新語句條件匹配不生效

最近在工作中寫了一個供別人調用的Oracle的存儲過程接口,功能很簡單,就是根據傳入的幾個參數來更新表中的某些數據,但是在聯調過程中傳入的更新匹配條件和被更新的數據一致對不上,更新的數據會比匹配的三個條件的數據多&#xff0…

注解 @Slf4j

注解 Slf4j 1. 注解由來: Slf4j 是 Lombok 提供的一種注解,用于在類中自動生成一個名為 log 的日志對象。通過使用 Slf4j 注解,可以方便地在代碼中使用日志功能,而無需手動創建和初始化日志對象。 2. 注解示例: Slf…

Spring系列篇--關于AOP【面向切面】的詳解

目錄 一.AOP是什么 二.案例演示 1.前置通知1.1 先準備接口 1.2然后再準備好實現類 1.3對我們的目標對象進行JavaBean配置 1.4 編寫前置系統日志通知 1.5配置系統通知XML中的JavaBean 1.6 配置代理XML中的JavaBean 1.7 測試代碼開始測試 注意這里有一個報錯問題&…

JVM虛擬機:初始化的介紹

本文重點 我們前面學習了三個步驟: 裝載 連接 初始化 初始化 初始化的時候,會為靜態成員變量賦值初始值,它有兩種方式: ①聲明類變量是指定初始值 ②使用靜態代碼塊為類變量指定初始值 例子 最后輸出的結果為3,它的過程是這樣的: main方法中輸出T.count,由于count是…

自簽證書讓Chrome信任的方式

自簽證書讓Chrome信任的方式(域名情況) 網站是搭建在linux上的,內容大概是一個code-server;我要在windows的chrome中訪問,在Linux機器上自簽了一個證書,準備讓windows中的chrome信任。linux裝好openssl。首先買好域名,配置好解析…

tkinter+爬蟲+pygame實現音樂播放器

文章目錄 前文安裝模塊示意圖爬蟲完整代碼pygametkinter完整代碼結尾前文 本文將涉及爬蟲(數據的獲取),pygame(音樂播放器),tkinter(界面顯示),將他們匯聚到一起制造一個音樂播放器,歡迎大家的訂閱。 安裝模塊 pip install requests,parsel,lxpy,pygame 示意圖