Java IO小結

IO體系繼承圖

兩個進程間通過網絡傳輸字符串

在計算機底層傳輸?shù)闹挥行稳?code>01011101這種數(shù)字,1字節(jié)是由8位bit組成走哺,而字符則是在某種字符集下字節(jié)的表現(xiàn)形式蚯嫌,最終都是通過一串01數(shù)字表達。當我們談論字符而忽略字符集時是完全沒有意義的丙躏,之所以有時不用去關心字符集是因為平臺往往是有個默認的字符集择示。所以在傳輸字符的時候,發(fā)送方和接收方必須要事先約定好字符集晒旅。

下面的例子摘自《Java特種兵》書籍的第四章

例如發(fā)送2個漢字栅盲,用UTF-8編碼發(fā)送后會占用6個字節(jié),對方若知道傳來的數(shù)據是UTF-8編碼废恋,便知道這6個字節(jié)代表什么漢字剪菱,就自然能正確得到char字符了。但是如果對方用GBK來編碼拴签,則可能會認為有3個字符孝常,若按照每2個字節(jié)計算一個字符,得到的3個字符自然不是需要傳遞的2個漢字字符蚓哩。假如此時意識到自己的編碼錯誤了构灸,通過得到的3個字符的字符串調用get-Byte(“GBK”)還可以還原6個字節(jié),然后通過這6個字節(jié)再用new String(byte[]岸梨,“UTF-8”)得到實際的兩個漢字喜颁。真的是這樣嗎?要知道這是偶然的曹阔,不是必然的半开,因為UTF-8轉換出來的6個字節(jié),當按照每2個字節(jié)組成編碼時赃份,這個編碼未必在GBK的編碼范圍內寂拆,若不在GBK的編碼范圍內,就可能會用一個“抓韩?”或其他字符來代表纠永,由于“?”本身也是一個字符谒拴,當再次調用get-Byte(“GBK”)時得到的對應字節(jié)就是“尝江?”對應的字節(jié),而不是原來字符的字節(jié)英上,有可能都不再是6個字節(jié)了炭序。換句話說啤覆,這樣的情況是永遠無法轉換回來的。

字節(jié)流和字符流的關系
Reader/Writer內在的實現(xiàn)是通過sun.nio.cs.StreamDecoder惭聂、sun.nio.cs.StreamEn-coder來對字符集進行處理窗声,最終還是通過字節(jié)來完成發(fā)送和接收的。

read()的小疑惑

InputStream.read()方法返回一個int值彼妻,表示從流中讀取的一個字節(jié)嫌佑。我們知道byte類型的取值范圍是:-128到127豆茫,但是read方法返回值的范圍是0 - 255(另外返回-1表示流中沒有可讀字節(jié))侨歉。
為什么要這樣設計呢?其中一個原因是因為字符集的碼表都是用非負數(shù)來表示的揩魂。
那如何進行轉換呢幽邓?在BufferedInputStream中,其read()方法是這樣寫的

public synchronized int read() throws IOException {
    if (pos >= count) {
        fill();
        if (pos >= count)
            return -1;
    }
    return buf[pos++] & 0xff;
}

其中buf是byte數(shù)組火脉,可以看到通過buf[pos++] & 0xff將字節(jié)的范圍轉移到0 - 255牵舵。

按用途分類流

字節(jié)輸入流 字節(jié)輸入流 字符輸入流 字符輸出流
基礎 InputStream OutputStream Reader InputStreamReader Writer OutputStreamWriter
數(shù)組 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
文件 FileInputStream RandomAccessFile FileOutputStream RandomAccessFile FileReader FileWriter
網絡 SocketInputStream URL HttpURLConnection Socket SocketOutputStream URL HttpURLConnection Socket
管道 PipedInputStream PipedOutputStream PipedReader PipedWriter
緩沖 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
Filtering FilterInputStream FilterOutputStream FilterReader FilterWriter
解析 PushbackInputStream StreamTokenizer PushbackReader LineNumberReader
String StringReader StringWriter
Data DataInputStream DataOutputStream
格式 PrintStream PrintWriter
序列化 ObjectInputStream ObjectOutputStream
Utilities SequenceInputStream LineNumberInputStream LineNumberReader

擴展閱讀
Java IO Tutorial

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倦挂,隨后出現(xiàn)的幾起案子畸颅,更是在濱河造成了極大的恐慌,老刑警劉巖方援,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件没炒,死亡現(xiàn)場離奇詭異,居然都是意外死亡犯戏,警方通過查閱死者的電腦和手機送火,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來先匪,“玉大人种吸,你說我怎么就攤上這事⊙椒牵” “怎么了坚俗?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岸裙。 經常有香客問我坦冠,道長,這世上最難降的妖魔是什么哥桥? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任辙浑,我火速辦了婚禮,結果婚禮上拟糕,老公的妹妹穿的比我還像新娘判呕。我一直安慰自己倦踢,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布侠草。 她就那樣靜靜地躺著辱挥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪边涕。 梳的紋絲不亂的頭發(fā)上晤碘,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音功蜓,去河邊找鬼园爷。 笑死,一個胖子當著我的面吹牛式撼,可吹牛的內容都是我干的童社。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼著隆,長吁一口氣:“原來是場噩夢啊……” “哼扰楼!你這毒婦竟也來了?” 一聲冷哼從身側響起美浦,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弦赖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浦辨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹬竖,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年荤牍,在試婚紗的時候發(fā)現(xiàn)自己被綠了案腺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡康吵,死狀恐怖劈榨,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情晦嵌,我是刑警寧澤同辣,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站惭载,受9級特大地震影響旱函,放射性物質發(fā)生泄漏。R本人自食惡果不足惜描滔,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一棒妨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧含长,春花似錦券腔、人聲如沸伏穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枕扫。三九已至,卻和暖如春辱魁,著一層夾襖步出監(jiān)牢的瞬間烟瞧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工染簇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留参滴,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓剖笙,卻偏偏與公主長得像卵洗,于是被迫代替她去往敵國和親请唱。 傳聞我的和親對象是個殘疾皇子弥咪,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容