深入分析Java Web-02-Java的I/O

前言

I/O問題從你開始使用電腦時就要接觸,例如你打開電腦,還未進入操作系統時,最先進入的是BIOS(Basic Input/Output System),也是就是主板的系統,作為使用電腦的一步就已經開始涉及IO了,作為人機交互的第一步,I/O是機器獲取和交換信息的主要渠道。

1.I/O分類

在Java中java.io下大概有接近80個類,進行以下分組:

基於字節操作的I/O接口:InputStream和OutputStream。 基於字符操作的I/O接口:Writer和Reader。 基於磁盤操作的I/O接口:File。 基於網絡操作的I/O接口:Socket。 注意:Socket類並不在java.io下 核心問題 數據格式 2.傳輸方式 1.1 基於字節的I/O操作接口

基於字節的I/O操作接口輸入和輸出分別是InputSream和OutputStream,層次結構如下:

1.2磁盤I/O工作機制

(1)標準訪問文件的方式 當應用程序調用read()接口時,操作系統檢查在內核的高速緩存中沒有需要的數據,如果已經緩存了,那麼就直接從緩存中返回,如果沒有,則從磁盤中讀取,然後緩存在操作系統的緩存中。 寫入的方式是,調用write()接口,將數據從用戶地址空間複製到內核地址空間的緩存中。這時對用戶程序來說寫操作就已經完成,至於什麼時候再寫到磁盤中,由操作系統決定,除非顯式調用了sync同步命令。 (2)直接I/O方式 所謂的直接I/O的方式就是應用程序直接訪問磁盤數據,而不是經過操作系統內核數據緩衝區,這樣做的目的就是減少一次從內核緩衝區到用戶程序緩存的數據複製。 (3)同步訪問文件的方式 (4)異步訪問文件的方式 (5)內存映射的方式

1.3 解釋

以上磁盤的工作機制基本都是抄書的,如果只是抄書,我覺得毫無意義,還不如直接去看書呢。 我在這裡想解釋一下,很多人都把內存和磁盤混為一談,比如你這手機內存多大的呀?128G。每當聽到這樣的對話,我都會默許他說的其實是磁盤存儲空間,而不是真的內存大小。當我們運行或者打開這個文件時,我們會將這個程序讀到內存裡去,這就是為什麼內存越大,可同時運行的程序越多。 一個可以明顯感知到磁盤和內存區別,就是我們在裝系統的時候,如果我們選擇使用U盤啟動PE,然後通過U盤來裝系統,當PE正常運行,這個時候,你拔掉U盤,你覺得你的電腦會黑屏關機嗎?答案是不會的,我們確實用U盤來啟動了,但是U盤裡的PE並沒有運行在U盤上,而是讀到了內存,所以當你把U盤拔掉,電腦並不會關機,是不是沒試過?那就趕快試試吧?以後再有人需要裝系統的時候,你就可以展示你的“祖傳裝系統”手藝了。

1.4 Java訪問磁盤文件

我們磁盤中唯一最小描述就是文件,也是操作系統和磁盤驅動器交互的最小單元。值得注意的是,Java創建File對象時,不會關注這個對象是否存在,就好像我們會存很多人的電話號碼,但是不會逐個校驗每個電話號碼是否能打通。

2.網絡I/O

前幾篇已經介紹了網絡傳輸的部分內容,這裡就介紹一下影響網絡傳輸的因素:

帶寬 傳輸距離 TCP擁塞 點擊查看更多內容

歡迎關注,會陸續發佈一些知識點總結,減少你的讀書時間,一起交流面試經驗!每月隨機抽取20名粉絲進入高級技術交流群(大量資料、BAT員工)!

div class="pgc-img">深入分析Java Web-02-Java的I/O


分享到:


相關文章: