當前位置:首頁 » 編程語言 » java中的io

java中的io

發布時間: 2022-08-21 12:16:03

java 提供了哪些IO方式

Java IO 方式有很多種,基於不同的 IO 抽象模型和交互方式,可以進行簡單區分。
首先,傳統的 java.io 包,它基於流模型實現,提供了我們最熟知的一些 IO 功能,比如 File 抽象、輸入輸出流等。交互方式是同步、阻塞的方式,也就是說,在讀取輸入流或者寫入輸出流時,在讀、寫動作完成之前,線程會一直阻塞在那裡,它們之間的調用是可靠的線性順序。
java.io 包的好處是代碼比較簡單、直觀,缺點則是 IO 效率和擴展性存在局限性,容易成為應用性能的瓶頸。
很多時候,人們也把 java.net 下面提供的部分網路 API,比如 Socket、ServerSocket、HttpURLConnection 也歸類到同步阻塞 IO 類庫,因為網路通信同樣是 IO 行為。
第二,在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以構建多路復用的、同步非阻塞 IO 程序,同時提供了更接近操作系統底層的高性能數據操作方式。
第三,在 Java 7 中,NIO 有了進一步的改進,也就是 NIO 2,引入了非同步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。非同步 IO 操作基於事件和回調機制,可以簡單理解為,應用操作直接返回,而不會阻塞在那裡,當後台處理完成,操作系統會通知相應線程進行後續工作。

❷ Java中IO與NIO的區別和使用場景

在java2以前,傳統的socket IO中,需要為每個連接創建一個線程,當並發的連接數量非常巨大時,線程所佔用的棧內存和CPU線程切換的開銷將非常巨大。java5以後使用NIO,不再需要為每個線程創建單獨的線程,可以用一個含有限數量線程的線程池,甚至一個線程來為任意數量的連接服務。由於線程數量小於連接數量,所以每個線程進行IO操作時就不能阻塞,如果阻塞的話,有些連接就得不到處理,NIO提供了這種非阻塞的能力。

NIO 設計背後的基石:反應器模式,用於事件多路分離和分派的體系結構模式。

反應器(Reactor):用於事件多路分離和分派的體系結構模式

通常的,對一個文件描述符指定的文件或設備, 有兩種工作方式: 阻塞 與非阻塞 。所謂阻塞方式的意思是指, 當試圖對該文件描述符進行讀寫時, 如果當時沒有東西可讀,或者暫時不可寫, 程序就進入等待 狀態, 直到有東西可讀或者可寫為止。而對於非阻塞狀態, 如果沒有東西可讀, 或者不可寫, 讀寫函數馬上返回, 而不會等待 。

一種常用做法是:每建立一個Socket連接時,同時創建一個新線程對該Socket進行單獨通信(採用阻塞的方式通信)。這種方式具有很高的響應速度,並且控制起來也很簡單,在連接數較少的時候非常有效,但是如果對每一個連接都產生一個線程的無疑是對系統資源的一種浪費,如果連接數較多將會出現資源不足的情況。

另一種較高效的做法是:伺服器端保存一個Socket連接列表,然後對這個列表進行輪詢,如果發現某個Socket埠上有數據可讀時(讀就緒),則調用該socket連接的相應讀操作;如果發現某個 Socket埠上有數據可寫時(寫就緒),則調用該socket連接的相應寫操作;如果某個埠的Socket連接已經中斷,則調用相應的析構方法關閉該埠。這樣能充分利用伺服器資源,效率得到了很大提高。

傳統的阻塞式IO,每個連接必須要開一個線程來處理,並且沒處理完線程不能退出。

非阻塞式IO,由於基於反應器模式,用於事件多路分離和分派的體系結構模式,所以可以利用線程池來處理。事件來了就處理,處理完了就把線程歸還。而傳統阻塞方式不能使用線程池來處理,假設當前有10000個連接,非阻塞方式可能用1000個線程的線程池就搞定了,而傳統阻塞方式就需要開10000個來處理。如果連接數較多將會出現資源不足的情況。非阻塞的核心優勢就在這里。

為什麼會這樣,下面就對他們做進一步細致具體的分析:

首先,我們來分析傳統阻塞式IO的瓶頸在哪裡。在連接數不多的情況下,傳統IO編寫容易方便使用。但是隨著連接數的增多,問題傳統IO就不行了。因為前面說過,傳統IO處理每個連接都要消耗一個線程,而程序的效率當線程數不多時是隨著線程數的增加而增加,但是到一定的數量之後,是隨著線程數的增加而減少。這里我們得出結論,傳統阻塞式IO的瓶頸在於不能處理過多的連接。

然後,非阻塞式IO的出現的目的就是為了解決這個瓶頸。而非阻塞式IO是怎麼實現的呢?非阻塞IO處理連接的線程數和連接數沒有聯系,也就是說處理 10000個連接非阻塞IO不需要10000個線程,你可以用1000個也可以用2000個線程來處理。因為非阻塞IO處理連接是非同步的。當某個鏈接發送請求到伺服器,伺服器把這個連接請求當作一個請求"事件",並把這個"事件"分配給相應的函數處理。我們可以把這個處理函數放到線程中去執行,執行完就把線程歸還。這樣一個線程就可以非同步的處理多個事件。而阻塞式IO的線程的大部分時間都浪費在等待請求上了。

所謂阻塞式IO流,就是指在從數據流當中讀寫數據的的時候,阻塞當前線程,直到IO流可以

重新使用為止,你也可以使用流的avaliableBytes()函數看看當前流當中有多少位元組可以讀取,這樣

就不會再阻塞了。

❸ java中的IO流是什麼啊該怎麼理解啊

關於你這個方向性的問題我一開始學的時候也覺得反了。後來搞清楚目標對象就懂了。理解Java的IO流,首先要把視角放在內存上,而不是放在文件上。
InputStream是用來寫入的沒錯,但不是寫入文件中,而是寫入內存中。所以InputStream的作用是從文件中讀取數據然後寫入內存中或者說寫入到正在運行的程序中。
而OutputStream同理,是從內存/程序中將數據推送出去,把數據保存到文件中。
以Java程序作為主視角,你就能懂了。Input讀取是為了讀給程序用,Output寫出是程序把數據輸出到硬碟上了。

❹ 請問Java中的io是什麼意思呀

io--InputStream,outputStream,是輸入流、輸出流的意思

❺ Java中的IO是指什麼

北京積雲IT申老師為您解答:
指的是輸出輸入流

❻ 同學們知道Java中的IO是指什麼

一般指文件相關的操作。在Java中,使用文件流進行編碼時,需要引入對應的JAR包,而其中最主要的類,像File、FileInputStream、FileOutputStream等等,大多都封裝在IO這個包裡面。所以Java中,說到IO相關的操作,一般情況下都會認為是文件相關的操作。

❼ java中的io流分為幾種

分兩大種,輸入流和輸出流
輸入流分為位元組輸入流,字元輸入流

輸出流分為位元組輸出流,字元輸出流

這四大類各自有各自的分支,各有各的功能,但總的來說主要是這四種。
字元流讀速寫速要比位元組流快,沒有亂碼現象,但是它只能讀寫文檔(txt);位元組流可以讀寫任意文件。
java.io下是java的IO流
以下是幾種常用流
FileInputStream文件位元組輸入流
FileOutputStream文件位元組輸出流
FileReader文件字元輸入流
FileWriter文件字元輸出流

❽ java中什麼是IO流

理解Java的IO流,首答先要把視角放在內存上,而不是放在文件上。
InputStream是用來寫入的沒錯,但不是寫入文件中,而是寫入內存中。所以InputStream的作用是從文件中讀取數據然後寫入內存中或者說寫入到正在運行的程序中。
而OutputStream同理,是從內存/程序中將數據推送出去,把數據保存到文件中。
以Java程序作為主視角,你就能懂了。Input讀取是為了讀給程序用,Output寫出是程序把數據輸出到硬碟上了。

熱點內容
文件夾怎麼打開 發布:2025-01-18 18:47:07 瀏覽:296
杉德卡卡號和密碼看哪裡 發布:2025-01-18 18:43:27 瀏覽:712
android返回退出 發布:2025-01-18 18:43:26 瀏覽:601
linux採集視頻 發布:2025-01-18 18:38:38 瀏覽:638
差異度演算法 發布:2025-01-18 18:34:27 瀏覽:698
電腦全套配置有哪些 發布:2025-01-18 18:32:39 瀏覽:145
新項目源碼 發布:2025-01-18 18:14:48 瀏覽:517
腳本設計圖 發布:2025-01-18 18:06:17 瀏覽:601
內部存儲空間不足總是跳出來 發布:2025-01-18 17:56:22 瀏覽:951
安卓光遇更新後魔法商店去哪裡了 發布:2025-01-18 17:55:47 瀏覽:133