Java基礎(chǔ)知識(shí)15-I/O流1


I/O的基礎(chǔ)知識(shí)

Java 程序通過流執(zhí)行 I/O. 流是一種抽象, 要么產(chǎn)生信息, 要么使用信息. 流通過 Java 的 I/O 系統(tǒng)連接到物理設(shè)備.

所有流的行為方式都是相同的, 盡管與他們鏈接的物理設(shè)備是不同的.

因此, 可以為任意類型的設(shè)備應(yīng)用相同的 I/O 類和方法. 這意味著可以將許多不同類型的輸入-磁盤文件,鍵盤或網(wǎng)絡(luò) socket, 抽象為輸入流. 與之對(duì)應(yīng), 輸入流可以引用控制臺(tái),磁盤文件或網(wǎng)絡(luò)連接. 流是處理輸入/輸出的一種清晰方式.

字節(jié)流和字符流

Java 定義了兩種類型的流: 字節(jié)流額字符流.

字節(jié)流為處理字節(jié)的輸入和輸出提供了方法. 例如, 當(dāng)讀取和寫入二進(jìn)制數(shù)據(jù)時(shí), 使用的就是字節(jié)流.

字符流為處理字符的輸入和輸出提供了方便的方法. 它們使用 Unicode 編碼, 所以可以被國(guó)際化. 此外, 在某些情況下字符流比字節(jié)流高效.

另外一點(diǎn): 在最底層, 所有 I/O 仍然是面向字節(jié)的. 基于字符的流只是為處理字符提供了一種方便和高效的方法.

字節(jié)流

字節(jié)流是通過兩個(gè)類層次定義的. 在頂級(jí)是兩個(gè)抽象類: InputStreamOutputStream.

每個(gè)抽象類都有幾個(gè)吃力何種不同設(shè)備的具體子類, 例如磁盤文件, 網(wǎng)絡(luò)連接甚至內(nèi)存緩沖區(qū).

下面列出了 java.io 包中的字符流類

流 類 含 義
BufferedInputStream 緩沖的輸入流
BufferedOutputStream 緩沖的輸出流
ByteArrayInputStream 讀取字節(jié)數(shù)組內(nèi)容的輸入流
ByteArrayOutputStream 向字節(jié)數(shù)組寫入內(nèi)容的輸出流
DataInputStream 包含讀取 Java 標(biāo)準(zhǔn)數(shù)據(jù)類型的方法的輸入流
DataOutputStream 包含寫入 Java 標(biāo)準(zhǔn)數(shù)據(jù)類型的方法的輸出流
FileInputStream 讀取文件內(nèi)容的輸入流
FileOnputStream 向文件寫入內(nèi)容的輸出流
FilterInputStream 實(shí)現(xiàn)InputStream
FilterOutputStream 實(shí)現(xiàn)OutputStream
ObjectInputStream 用于對(duì)象的輸入流
ObjectOutputStream 用于對(duì)象的輸出流
PipedInputStream 輸入管道
PipedOutputStream 輸出管道
PrintStream 包含print() 和 println()

抽象類 InputStreamOutputStream 定義了其他流類實(shí)現(xiàn)的一些關(guān)鍵方法. 其中最重要的兩個(gè)方式 read()write(), 這兩個(gè)方法分別讀取和寫入字節(jié)數(shù)據(jù). 每個(gè)方法都有抽象形式, 派生的流類必須重寫這兩個(gè)方法.

字符流

字符流是通過兩個(gè)類層次定義的. 在頂層是兩個(gè)抽象類: ReaderWriter. 這兩個(gè)抽象類處理 Unicode 字符流.

下面列出 java.io包下的字符流類

流 類 含 義
BufferedReader 緩沖的輸入字符流
BufferedWriter 緩沖的輸出字符流
CharArrayReader 從字符數(shù)組讀取內(nèi)容的輸入流
CharArrayWriter 從字符數(shù)組寫入內(nèi)容的輸出流
FileReader 從文件讀取內(nèi)容的輸入流
FileWriter 向文件寫入內(nèi)容的輸出流
FilterReader 過濾的讀取器
FilterWriter 過濾的寫入器
InputStreamReader 將字節(jié)轉(zhuǎn)換成字符的輸入流
OutputStreamWriter 將字符轉(zhuǎn)成成字節(jié)的輸出流
PipedReader 輸入管道
PipedWriter 輸出管道
PrintWriter 包含 print() 和 println()
StringReader 從字符串讀取內(nèi)容的輸入流
StringWriter 向字符串寫入內(nèi)容的輸出流

抽象類 ReaderWriter 定義了其它幾個(gè)流類實(shí)現(xiàn)的重要方法. 最重要的兩個(gè)方法是 read()write(), 這兩個(gè)方法分別讀取和寫入字符數(shù)據(jù). 每個(gè)方法都有抽象形式, 派生的流類必須實(shí)現(xiàn)這兩個(gè)方法.

PrintWriter 類

盡管使用 System.out 向控制臺(tái)輸出可以接受的, 但是最好將其用于調(diào)試. 對(duì)于實(shí)際的程序, 使用 java 向控制臺(tái)輸出的推薦方法是通過 PrintWriter 流.

PrintWriter 類定義了幾個(gè)構(gòu)造函數(shù), 在此將使用的構(gòu)造函數(shù)如下所示:

PrintWriter(OutputStream outputStream, boolean flushingOn)

其中, outputStream 是OutputStream 類型的對(duì)象, flushingOn 控制Java 是否在每次調(diào)用 println() 方法時(shí)刷新輸出流. 如果flushingOn 為true, 就自動(dòng)刷新; 如果為false, 那么不會(huì)自動(dòng)刷新.

PrintWriter 支持 print()println()方法. 因此, 可以使用與System.out 相同的方式使用它們. 如果參數(shù)不是簡(jiǎn)單類型, PrintWriter 方法會(huì)調(diào)用對(duì)象的 toString() 方法, 然后輸出結(jié)果.

為了使用 PrintWriter 向控制臺(tái)輸出, 為輸出流制定 System.out, 然后在每個(gè)新行之后刷新流.

public class PrintWriterDemo {
  public static void main(String args[]) {
    PrintWriter pw = new PrintWriter(System.out, true);
    pw.println("This is a string");
    int i = -7;
    pw.println(i);
  }
}

讀/寫文件

對(duì)于讀/寫文件, 兩個(gè)最常用的流是 FileInputStreamFileOutputStream, 這兩個(gè)類創(chuàng)建與文件鏈接的字節(jié)流.

為了打開文件, 只需要?jiǎng)?chuàng)建簡(jiǎn)單的創(chuàng)建這些類中某個(gè)類的對(duì)象, 指定文件名作為構(gòu)造函數(shù)的參數(shù)即可.

FileInputStream(String fileName)
FileOutputStream(String fileName)

文件使用完之后必須關(guān)閉. 關(guān)閉文件是通過 close() 方法完成的, FileInputStreamFileOutputStream 都實(shí)現(xiàn)了該方法.

void close()

關(guān)閉文件會(huì)釋放文件分配的系統(tǒng)資源, 從而允許其他的文件使用這些資源. 關(guān)閉文件失敗會(huì)導(dǎo)致"內(nèi)存泄漏", 因?yàn)槲词褂玫馁Y源沒有被釋放.

注意: 從 JDK 7 開始, close() 方法是由 java.lang 包中的 AutoCloseable 接口指定的. java.io包中的 Closeable 接口竭誠(chéng)了AutoCloseable接口. 所有流類都實(shí)現(xiàn)了這兩個(gè)接口, 包括 FileInputStreamFileOutputStream.

可以使用兩種方法關(guān)閉文件, 第一種是傳統(tǒng)方法, 當(dāng)不在需要文件時(shí)顯式調(diào)用close()方法. 第二種方式是使用帶資源的try語句, 這種try語句是由JDK 7 新增的, 當(dāng)不再需要文件時(shí)能夠自動(dòng)關(guān)閉文件.

try (FileInputStream fin = new FileInputStream(args[0]);
      FileOutputStream fout = new FileOutputStream(args[1])) {
// ...

只有對(duì)于那些實(shí)現(xiàn)了 AotoCloseable 接口的資源, 才能使用帶資源的 try 語句.

下面是關(guān)于帶資源的 try 語句的3個(gè)關(guān)鍵點(diǎn):

  1. 帶資源的 try 語句管理的資源必須是實(shí)現(xiàn)了 AutoCloseable 接口的類的對(duì)象.
  2. 在 try 代碼中聲明的資源被隱式聲明為 final
  3. 通過使用分號(hào)分隔每個(gè)聲明可以管理多個(gè)資源.

此外請(qǐng)記住, 所聲明資源的作用域被限制在帶資源的 try 語句中.

帶資源的 try 語句的主要優(yōu)點(diǎn)是: 當(dāng) try 代碼塊結(jié)束時(shí), 資源會(huì)被自動(dòng)關(guān)閉. 因此, 不可能會(huì)忘記關(guān)閉流. 使用帶資源的 try 語句, 通趁镂瑁可以時(shí)源代碼更短, 更清晰, 更容易維護(hù).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巧婶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)艺栈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門英岭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人湿右,你說我怎么就攤上這事诅妹。” “怎么了毅人?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵吭狡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我堰塌,道長(zhǎng)赵刑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任场刑,我火速辦了婚禮般此,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牵现。我一直安慰自己铐懊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布瞎疼。 她就那樣靜靜地躺著科乎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贼急。 梳的紋絲不亂的頭發(fā)上茅茂,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音太抓,去河邊找鬼空闲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛走敌,可吹牛的內(nèi)容都是我干的碴倾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼掉丽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼跌榔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捶障,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤僧须,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后项炼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皆辽,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柑蛇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驱闷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡空免,死狀恐怖空另,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹋砚,我是刑警寧澤扼菠,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站坝咐,受9級(jí)特大地震影響循榆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墨坚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一秧饮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泽篮,春花似錦盗尸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亏拉,卻和暖如春扣蜻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背及塘。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工莽使, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磷蛹。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓吮旅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親味咳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庇勃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法槽驶,內(nèi)部類的語法责嚷,繼承相關(guān)的語法,異常的語法掂铐,線程的語...
    子非魚_t_閱讀 31,581評(píng)論 18 399
  • 一罕拂、流的概念和作用揍异。 流是一種有順序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合爆班,是對(duì)數(shù)據(jù)傳輸?shù)目偝苫虺橄笾灾馈<磾?shù)據(jù)在兩設(shè)備之間的傳輸...
    布魯斯不吐絲閱讀 10,018評(píng)論 2 95
  • 在經(jīng)過一次沒有準(zhǔn)備的面試后,發(fā)現(xiàn)自己雖然寫了兩年的android代碼柿菩,基礎(chǔ)知識(shí)卻忘的差不多了戚嗅。這是程序員的大忌,沒...
    猿來如癡閱讀 2,829評(píng)論 3 10
  • (一)Java部分 1枢舶、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,071評(píng)論 0 62
  • 最近老師一直在告訴我們凉泄,要保持覺知躏尉。當(dāng)我們知道,做到后众,悟到胀糜,就會(huì)得到! 保持覺知吼具,四個(gè)字很容易寫僚纷! 當(dāng)我們關(guān)注什么...
    金蘭幸福旅程閱讀 255評(píng)論 0 0