日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

對于JAVA I/O來說,I意味著Input(輸入),O意味著Output(輸出)。讀書寫作并非易事,而創(chuàng)建一個好的I/O系統(tǒng)更是一項艱難的任務。

古人云:“讀書破萬卷,下筆如有神”。也就是說,只有大量的閱讀,寫作的時候才能風生水起——寫作意味著輸出(我的知識傳播給他人),而讀書意味著輸入(從他人的知識中汲取營養(yǎng))。

01、數(shù)據(jù)流之字節(jié)與字符

Java所有的I/O機制都是基于 數(shù)據(jù)流 進行的輸入輸出。數(shù)據(jù)流可分為兩種:

1)字節(jié)流,未經(jīng)加工的原始二進制數(shù)據(jù),最小的數(shù)據(jù)單元是 字節(jié) 。

2)字符流,經(jīng)過一定編碼處理后符合某種格式規(guī)定的數(shù)據(jù),最小的數(shù)據(jù)單元是 字符 ——占用兩個字節(jié)。

OutputStream 和 InputStream 用來處理字節(jié)流; Writer 和 Reader 用來處理字符流; OutputStreamWriter 可以把 OutputStream 轉換為 Writer , InputStreamReader 可以把 InputStream 轉換為 Reader 。

Java的設計者為此設計了眾多的類,見下圖。

Java I/O 入門篇

 

看到這么多類,你一定感覺頭暈目眩。反正我已經(jīng)看得不耐煩了。搞這么多類,看起來頭真的大——這也從側面說明實際的應用場景各有各的不同——你也完全不用擔心,因為實際項目當中,根本就不可能全用到(我就沒用過 SequenceOutputStream )。

我建議你在 學習的時候要掌握一種“挑三揀四”的能力 ——學習自己感興趣的、必須掌握的、對能力有所提升的知識。切不可囫圇吞棗,強迫自己什么都學。什么都學,最后的結果可能是什么都不會。

字符流是基于字節(jié)流的,因此,我們先來學習一下字節(jié)流的兩個最基礎的類—— OutputStream 和 InputStream ,它們是必須要掌握的。

1)OutputStream

OutputStream 提供了4個非常有用的方法,如下。

其子類 ByteArrayOutputStream 和 BufferedOuputStream 最為常用(File相關類放在下個小節(jié))。

①、 ByteArrayOutputStream 通常用于在內存中創(chuàng)建一個字節(jié)數(shù)組緩沖區(qū),數(shù)據(jù)被“臨時”放在此緩沖區(qū)中,并不會輸出到文件或者網(wǎng)絡套接字中——就好像一個中轉站,負責把輸入流中的數(shù)據(jù)讀入到內存緩沖區(qū)中,你可以調用它的 toByteArray() 方法來獲取字節(jié)數(shù)組。

來看下例。

ByteArrayOutputStream 的責任就是把 InputStream 中的字節(jié)流“一字不差”的讀出來——這個工具方法很重要,很重要,很重要——可以解決粘包的問題。

②、 BufferedOuputStream 實現(xiàn)了一個緩沖輸出流,可以將很多小的數(shù)據(jù)緩存為一個大塊的數(shù)據(jù),然后一次性地輸出到文件或者網(wǎng)絡套接字中——這里的“緩沖”和 ByteArrayOutputStream 的“緩沖”有著很大的不同——前者是為了下一次的一次性輸出,后者就是單純的為了緩沖,不存在輸出。

來看下例。

使用 BufferedOuputStream 的時候,一定要記得調用 flush() 方法將數(shù)據(jù)從緩沖區(qū)中全部輸出。使用完畢后,調用 close() 方法關閉輸出流,釋放與流相關的系統(tǒng)資源。

2)InputStream

InputStream 也提供了4個非常有用的方法,如下。

其子類 BufferedInputStream (緩沖輸入流)最為常用,效率最高(當我們不確定讀入的是大數(shù)據(jù)還是小數(shù)據(jù))。

無緩沖流上的每個讀取請求通常會導致對操作系統(tǒng)的調用以讀取所請求的字節(jié)數(shù)——進行系統(tǒng)調用的開銷非常大。但緩沖輸入流就不一樣了,它通過對內部緩沖區(qū)執(zhí)行(例如)高達8k字節(jié)的大量讀取,然后針對緩沖區(qū)的大小再分配字節(jié)來減少系統(tǒng)調用的開銷——性能會提高很多。

使用示例如下。

先來看一個輔助方法 byteToInt ,把字節(jié)轉換成int。

再來看如何從輸入流中,根據(jù)指定的長度contentLength來讀取數(shù)據(jù)。 readBytes() 方法在之前已經(jīng)提到過。

我敢保證,只要你搞懂了字節(jié)流,字符流也就不在話下——所以,我們在此略過字符流。

02、File類

前面我們了解到,數(shù)據(jù)有兩種格式:字節(jié)與字符。那么這些數(shù)據(jù)從哪里來,又存往何處呢?

一個主要的方式就是從物理磁盤上進行讀取和存儲,磁盤的唯一最小描述就是文件。也就是說上層應用程序只能通過文件來操作磁盤上的數(shù)據(jù),文件也是操作系統(tǒng)和磁盤驅動器交互的一個最小單元。

在Java中,通常用 File 類來操作文件。當然了,F(xiàn)ile不止是文件,它也是文件夾(目錄)。File類保存了文件或目錄的各種元數(shù)據(jù)信息(文件名、文件長度、最后修改時間、是否可讀、當前文件的路徑名等等)。

通過File類以及文件輸入輸出流( FileInputStream 、 FileOutputStream ),可以輕松地創(chuàng)建、刪除、復制文件或者目錄。

這里,我提供給你一個實用的文件工具類——FileUtils。

限于篇幅,就不貼太多代碼了,需要的話找我(微信:qing_gee)要。

03、網(wǎng)絡套接字——Socket

雖然網(wǎng)絡套接字( Socket )并不在java.io包下,但它和輸入輸出流密切相關。 File 和 Socket 是兩組主要的數(shù)據(jù)傳輸方式。

Socket 是描述計算機之間完成相互通信的一種抽象??梢园?Socket 比作為兩個城市之間的交通工具,有了交通工具(高鐵、汽車),就可以在城市之間來回穿梭了。交通工具有多種,每種交通工具也有相應的交通規(guī)則。 Socket 也一樣,也有多種。大部分情況下,我們使用的都是基于 TCP/IP 的套接字——一種穩(wěn)定的通信協(xié)議。

Java I/O 入門篇

 

假設主機A是客戶端,主機B是服務器端??蛻舳艘c服務器端通信,客戶端首先要創(chuàng)建一個 Socket 實例,操作系統(tǒng)將為這個 Socket 實例分配一個沒有被使用的本地端口號,并創(chuàng)建一個套接字數(shù)據(jù)結構,直到這個連接關閉。

示例如下。

與之對應的,服務端需要創(chuàng)建一個 ServerSocket 實例,之后調用 accept() 方法進入阻塞狀態(tài),等待客戶端的請求。當一個新的請求到來時,將為這個連接創(chuàng)建一個新的套接字數(shù)據(jù)結構。

示例如下。

Socket 一旦打通,就可以通過 InputStream 和 OutputStream 進行數(shù)據(jù)傳輸了。

04、壓縮

Java I/O 支持壓縮格式的數(shù)據(jù)流。在 Socket 通信中,我常用 GZIPOutputStream 和 GZIPInputStream 來對數(shù)據(jù)流進行簡單地壓縮和解壓。

壓縮的好處就在于能夠減小網(wǎng)絡傳輸中數(shù)據(jù)的體積。代碼如下。

分享到:
標簽:Java
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定