国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

2018年第一周-Java的IO系統(tǒng)

kgbook / 845人閱讀

摘要:過(guò)濾器流,如等,是類庫(kù),是為了提供一些類讓你能夠處理一些極為常見(jiàn)的數(shù)據(jù)格式。讀寫器,由于流和過(guò)濾器流還是僅次于處理字節(jié),也就是二進(jìn)制。過(guò)濾器流緩沖流和類將寫入的數(shù)據(jù)存儲(chǔ)到緩沖區(qū)中一個(gè)名為的保護(hù)字節(jié)數(shù)組字段,直到緩沖區(qū)滿或刷新輸出流。

A little older, a little wiser, but happy to see you.
——Interstellar

2018年了,再過(guò)一年就要30歲了,年齡有一些,智慧也有了一些。主要集中在技術(shù)、技術(shù)經(jīng)驗(yàn)和工作經(jīng)驗(yàn)。一直都記錄在有道云筆記里,現(xiàn)在拿出來(lái)分享記錄下,也希望能得到大家的feedback。
另外也想堅(jiān)持做一些事情,2018年,我的目標(biāo)是每天都過(guò)的有意義。
這就需要定義什么叫有意義:

每天都能按照自己,真正的自己的意愿。不受集體思想的影響。做自己!

每天都沉淀東西出來(lái),一天天的積累。

一次以上旅游。

年底需計(jì)劃下一年的事情

所以其中一件需要積累和沉淀的就是寫作能力,或許剛開始需要參考一些書籍,但我希望能沉淀下來(lái)。所以給自己立個(gè)flag,每周在segmentfault發(fā)一篇文章。 話不多說(shuō),馬上進(jìn)入正題:

Java的IO系統(tǒng)

在學(xué)習(xí)IO之前,跟學(xué)其他新東西一樣,最核心最難的就是理解概念,特別是一堆很相近的概念,往往讓人產(chǎn)生困惑。如Java的IO系統(tǒng),我們?cè)谶@需區(qū)分以下概念:

流(Stream),是有IO系統(tǒng)設(shè)計(jì)者創(chuàng)造出來(lái)的概念,將具體設(shè)備的IO抽象為流,所以不同的設(shè)備IO對(duì)于不同的流,如FileInputStream和ByteArrayInputStream,前者的設(shè)備是操作系統(tǒng)的文件,后者則是操作系統(tǒng)的內(nèi)存。

過(guò)濾器流(FilterInputStream),如BufferedInputStream等,是JavaIO類庫(kù),是為了提供一些類讓你能夠處理一些極為常見(jiàn)的數(shù)據(jù)格式。如BufferedInputStream是為了解決緩沖問(wèn)題,DataInputStream是為了解決Java的數(shù)據(jù)格式。

讀寫器(Reader/Writer),由于流和過(guò)濾器流還是僅次于處理字節(jié),也就是二進(jìn)制。 而處理文本,就涉及到字符編碼格式的問(wèn)題。 實(shí)際上也是相當(dāng)于過(guò)濾器流,也是用裝飾模式,把面向字節(jié)的接口改為面向字符的接口。

I/O
對(duì)于(程序)語(yǔ)言設(shè)計(jì)者來(lái)說(shuō),其中一個(gè)難的任務(wù)是:創(chuàng)造一個(gè)好的I/O系統(tǒng)。

這個(gè)挑戰(zhàn)時(shí)來(lái)源于要覆蓋所有的可能性,不僅包括不同的I/O源和與之通訊的接受端(文件files、控制臺(tái)the console、網(wǎng)絡(luò)鏈接network connections等),而且還需要以多種不同的方式與它們進(jìn)行通信(順序sequential、隨機(jī)讀取random-access、緩沖buffered、二進(jìn)制binary、按字符character、按行by lines、按字by words等)。
為了解決這個(gè)難的任務(wù),Java類庫(kù)的設(shè)計(jì)者創(chuàng)建了大量的類。也正是這么多類,導(dǎo)致剛學(xué)IO的人一開始就被如此多類給難倒。
自從Java1.0版本開始,Java的I/O類庫(kù)發(fā)生明顯的改變,在原來(lái)面向字節(jié)的類中添加面向字符和基于Unicode的類。在JDK 1.4中添加了NIO類(其中N代表new,過(guò)了那么多年,其實(shí)不新啦)。
因此,在充分理解IO系統(tǒng)和正確地運(yùn)用之前,我們需要學(xué)習(xí)相當(dāng)數(shù)量的類。除此之外,很有必要理解IO類庫(kù)的演變過(guò)程,或許你會(huì)這么說(shuō)“不要用歷史打擾我,我只想知道怎么用”。 但問(wèn)題是,如果缺乏歷史的眼光,很快我們就會(huì)對(duì)什么時(shí)候該使用哪些類,以及什么時(shí)候不該使用它們而感到困惑。

輸入和輸出

使用IO庫(kù)往往會(huì)接觸到“流”這個(gè)概念,它代表任何有能力產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源對(duì)象或者是有能力接收數(shù)據(jù)的接收端對(duì)象。設(shè)計(jì)“流”這個(gè)概念,是為了屏蔽實(shí)際的IO設(shè)備中處理數(shù)據(jù)的細(xì)節(jié)。

InputStream和OuputStream時(shí)相當(dāng)原始的類。它們可以單個(gè)或成組地讀/寫字節(jié),但僅此而已。要確定字節(jié)的含義(比如,它們時(shí)整數(shù)還是IEEE 754浮點(diǎn)數(shù)或是Unicode文本),這完全由程序員和代碼來(lái)完成。不過(guò),有一些極為常見(jiàn)的數(shù)據(jù)格式,如果在類中提供這些數(shù)據(jù)格式的固定實(shí)現(xiàn),會(huì)很有好處。
于是Java提供了很多過(guò)濾器,可以附加到原始流中,在原始字節(jié)和各種格式之間來(lái)回轉(zhuǎn)換。
過(guò)濾器有兩個(gè)版本:過(guò)濾器流以及閱讀器讀寫器
過(guò)濾器流主要處理二進(jìn)制數(shù)據(jù),也就是作為字節(jié)處理。
閱讀器書寫器主要時(shí)處理多種編碼文本,如UTF-8和ISO 8859-1。

過(guò)濾器流——緩沖流BufferedInputStream和BufferedOutputStream

BufferedOutputStream類將寫入的數(shù)據(jù)存儲(chǔ)到緩沖區(qū)中(一個(gè)名為buf的保護(hù)字節(jié)數(shù)組字段),直到緩沖區(qū)滿或刷新輸出流。
它首先嘗試從緩沖區(qū)去獲取數(shù)據(jù),當(dāng)緩存區(qū)沒(méi)有數(shù)據(jù)時(shí),流才從底層的數(shù)據(jù)源中讀取數(shù)據(jù)。這時(shí),它會(huì)從源讀取盡可能多的數(shù)據(jù)進(jìn)入緩存區(qū),而不管是否馬上需要所有這些數(shù)據(jù)。那些不會(huì)立刻用到的數(shù)據(jù)(已緩存的)會(huì)在以后調(diào)用read()讀取。
因?yàn)閺拇疟P中讀取文件時(shí),從底層流中讀取幾百字節(jié)的數(shù)據(jù)與讀取1個(gè)字節(jié)數(shù)據(jù)的速度幾乎一樣快,因此緩沖可以顯著提高性能。
但對(duì)于網(wǎng)絡(luò)連接,這種效果則不明顯,在這里瓶頸往往是網(wǎng)絡(luò)傳送數(shù)據(jù)的速度,而不是網(wǎng)絡(luò)接口向程序傳送數(shù)據(jù)的速度或程序運(yùn)行的速度。盡管如此,緩沖輸入沒(méi)有什么壞處,隨著網(wǎng)絡(luò)的速度加快會(huì)變得更為重要。

過(guò)濾器流——PrintStream

PrintStream類是大多數(shù)程序員都會(huì)遇到的第一個(gè)過(guò)濾器輸出流,因?yàn)镾ystem.out就是一個(gè)PrintStream。

PrintStream是有害的,網(wǎng)絡(luò)程序員應(yīng)當(dāng)像躲避瘟疫一樣躲避它。

第一個(gè)問(wèn)題:println()方法輸出是與平臺(tái)有關(guān)的。在UNIX(包括Mac OS X)下是換行符(n),在Mac OS 9下時(shí)回車符(r),在Windows下時(shí)回車/換行對(duì)(rn)
第二個(gè)問(wèn)題:PrintStream假定使用所在平臺(tái)的默認(rèn)編碼方式。
第三個(gè)問(wèn)題:PrintStream吞掉了所有異常。

過(guò)濾器流——數(shù)據(jù)流DataInputStream和DataOutputStream

DataInputStream和DataOutputStream提供了一些方法,可以用二進(jìn)制格式讀/寫Java的基本數(shù)據(jù)類型和字符串。所用的二進(jìn)制格式主要用于在兩個(gè)不同的Java程序之間交換數(shù)據(jù)(可能通過(guò)網(wǎng)絡(luò)鏈接、數(shù)據(jù)文件、管道或其他中間介質(zhì))。
所有數(shù)據(jù)都以big-endian格式寫入。byte會(huì)寫為1字節(jié),short寫為2字節(jié),int寫為4字節(jié),long寫為8字節(jié)。浮點(diǎn)數(shù)和雙精浮點(diǎn)數(shù)分別寫為4字節(jié)和8字節(jié)的IEEE 754格式。 布爾數(shù)寫為1字節(jié),1表示true,0表示false。字符寫為兩個(gè)無(wú)符號(hào)字節(jié)。
writeChars(String s)方法只是對(duì)String參數(shù)迭代(循環(huán))處理,將各個(gè)字符按順序?qū)憺橐粋€(gè)2字節(jié)的big-endian Unicode字節(jié)(確切地講是UTF-16碼點(diǎn))。
writeBytes(String s)方法迭代處理String參數(shù),但只寫入每個(gè)字符的低字節(jié)。因此如果包含有Latin-1字符集意外的字符,其中信息將會(huì)丟失。對(duì)于一些指定了ASCII編碼的網(wǎng)絡(luò)協(xié)議來(lái)說(shuō),這個(gè)方法或許有用,但多數(shù)情況下都應(yīng)避免使用。
writeChars和writeBytes方法都不會(huì)對(duì)輸出流的字符串的長(zhǎng)度編碼。因此,你無(wú)法真正區(qū)分原始字符和作為字符串一部分的字符。簡(jiǎn)單的說(shuō)就是只支持ASCII編碼格式的字符串。
writeUTF(String s)方法則包括了字符串的長(zhǎng)度。它將字符串本身用Unicode UTF-8編碼的一個(gè)變體進(jìn)行編碼。由于這個(gè)變體編碼方式與大多數(shù)非Java軟件不兼容,所以應(yīng)當(dāng)只用于其他使用DataInputStream讀取字符串的Java程序進(jìn)行數(shù)據(jù)交換。(如果Sun當(dāng)初把這個(gè)方法及相應(yīng)的讀取方式命名為writeString()和readString(),而不是writeUTF()和readUTF(),那就不會(huì)產(chǎn)生任何混淆了)。
因此,為了與其他軟件交換UTF-8文本,應(yīng)使用帶適當(dāng)編碼功能的InputStreamReader

閱讀器和讀寫器

許多程序員在編碼時(shí)有一個(gè)壞習(xí)慣,好像所有文本都是ASCII編碼,或者至少是該平臺(tái)的內(nèi)置編碼方式。
雖然有些協(xié)議的編碼,采用ASCII編碼方式,如較老的、較簡(jiǎn)單的網(wǎng)絡(luò)協(xié)議(daytime, quote of the day和charge)。
但HTTP協(xié)議和其他很多較新的協(xié)議卻不是這樣,它們?cè)试S多種本地化編碼,如K0I8-R西里爾文、Big-5中文和土耳其語(yǔ)使用的ISO8859-9。
Java的內(nèi)置字符集時(shí)Unicode的UTF-16編碼。

Java定義了兩個(gè)抽象類,讀/寫字符的基本API,分別是java.io.Reader和java.io.Writer。

Reader和Writer最重要的具體子類是InputStreamReader和OutputStreamWriter類。InputStreamReader包含StreamDecoder類,而StreamDecoder類封裝一個(gè)底層輸入流InputStream,利用多態(tài),可以從不同設(shè)備中讀取原始字節(jié),然后根據(jù)指定的編碼方式,將這些字節(jié)轉(zhuǎn)換為Unicode字符。OutputStreamWriter類包含類StreamEncoder,StreamEncoder類封裝一個(gè)底層的輸出流OutputStream,利用多態(tài),可以往不同設(shè)備中寫入數(shù)據(jù),OutputStreamWriter從運(yùn)行中的程序中接受Unicode字符,然后使用制定的編碼方式將這些字符轉(zhuǎn)為字節(jié),再將這些字節(jié)寫入底層輸入流中。

閱讀器和讀寫器的過(guò)濾器

與過(guò)濾器流一樣,Reader和Writer有很多子類可以完成特定的過(guò)濾工作,包括:

BufferedReader

BufferedWriter

LineNumberReader

PushbackReader

PrintWriter

BufferedReader和BufferedWriter使用一個(gè)內(nèi)部字符數(shù)組作為緩沖區(qū)。
當(dāng)程序從BufferedReader讀取時(shí),文本會(huì)從緩沖區(qū)得到,而不是直接從底層輸入流或其他文本源讀取。當(dāng)緩沖區(qū)清空時(shí),才會(huì)去讀取文本,將文本填充此緩沖區(qū),盡管這些文本不是全部都立即需要,這樣可以使以后的讀取速度更快。當(dāng)程序?qū)懭胍粋€(gè)BufferedWriter時(shí),文本被放置在緩沖區(qū)中。只有緩沖區(qū)填滿或者當(dāng)書寫器顯式刷新輸出時(shí),文本才會(huì)被移到底層輸出流或其他目標(biāo),這使得寫入也要快很多。

參考:
《Java編程思想》
《Java網(wǎng)絡(luò)編程》

UML圖:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68172.html

相關(guān)文章

  • IDC中國(guó)云計(jì)算市場(chǎng)報(bào)告: BAT競(jìng)爭(zhēng)格局再現(xiàn)

    摘要:多強(qiáng)共存還是一家獨(dú)大,中國(guó)云計(jì)算市場(chǎng)的格局仍然未定,在年仍將戰(zhàn)事不斷。根據(jù)市場(chǎng)調(diào)研機(jī)構(gòu)最新報(bào)告顯示,在年第三季度,中國(guó)公有云市場(chǎng)再現(xiàn)競(jìng)爭(zhēng)格局。媒體根據(jù)營(yíng)收數(shù)據(jù)計(jì)算,百度智能云已列市場(chǎng)前三。年的頭三個(gè)月,百度智能云在市場(chǎng)上繼續(xù)動(dòng)作頻頻。多強(qiáng)共存還是一家獨(dú)大,中國(guó)云計(jì)算市場(chǎng)的格局仍然未定,在2019年仍將戰(zhàn)事不斷。根據(jù)市場(chǎng)調(diào)研機(jī)構(gòu)IDC最新報(bào)告顯示,在2018年第三季度,中國(guó)公有云(IaaS+P...

    edgardeng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<