首頁技術(shù)文章正文

IO流、字節(jié)流和字符流分別是什么?

更新時(shí)間:2020-07-24 來源:黑馬程序員 瀏覽量:

一:IO流的分類

  1)按流向分:

  輸入流:讀取數(shù)據(jù),把持久設(shè)備的數(shù)據(jù)讀取到內(nèi)存中。

  輸出流:寫出數(shù)據(jù),把內(nèi)存的數(shù)據(jù)寫出到持久設(shè)備。

  2)按數(shù)據(jù)類型分:

  計(jì)算機(jī)中一切數(shù)據(jù)都是:字節(jié)數(shù)據(jù)。

  字符數(shù)據(jù):底層還是字節(jié)數(shù)據(jù),但是可以根據(jù)某些規(guī)則,把字節(jié)變成人們認(rèn)識(shí)的文字、符號(hào)等等。

  字節(jié)流:數(shù)據(jù)在持久設(shè)備上都是以二進(jìn)制形式保存的。二進(jìn)制就是字節(jié)數(shù)據(jù)。Java就給出了字節(jié)流可以直接操作字節(jié)數(shù)據(jù)。

  字節(jié)輸入流:InputStream

  子類:FileInputStream

  字節(jié)輸出流:OutputStream

  子類:FileOutputStream

  字符流:讀取字符數(shù)據(jù)。數(shù)據(jù)在設(shè)備上是以二進(jìn)制形式表示,但是有些二進(jìn)制合并在一起可以表示一些字符數(shù)據(jù)。

  字符輸入流:Reader

  子類:FileReader

  字符輸出流:Writer

  子類:FileWriter

  注意:

  1)字節(jié)流可以對(duì)任意類型的文件按照字節(jié)進(jìn)行讀和寫的操作;例如:圖片、視頻、文本文件、word文檔、mp3等。

  2)字符流只能對(duì)文本類型的文件進(jìn)行操作;例如:.java文件、.txt等文件。

二:字節(jié)流

  1)字節(jié)輸出流 OutputStream

  public void close() :關(guān)閉此輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。

  public void write(byte[] byte):把這個(gè)byte字節(jié)數(shù)組中的所有數(shù)據(jù)寫到關(guān)聯(lián)的設(shè)備中(設(shè)備包括文件、網(wǎng)絡(luò)或者其他任何地方)。

  public void write(byte[] b, int off, int len) :把b字節(jié)中的數(shù)據(jù)從下標(biāo)off位置開始往出寫,共計(jì)寫len個(gè)。

  public abstract void write(int b) : 把這個(gè)b數(shù)據(jù)寫到關(guān)聯(lián)的設(shè)備中。

  注意:close方法,當(dāng)完成流的操作時(shí),必須調(diào)用此方法,釋放系統(tǒng)資源。

  2)字節(jié)輸入流 InputStream

  public void close() :關(guān)閉此輸入流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。

  public abstract int read(): 調(diào)用一次read,就可以從關(guān)聯(lián)的文件中讀取一個(gè)字節(jié)數(shù)據(jù),并返回這個(gè)字節(jié)數(shù)據(jù)。方法可以從關(guān)聯(lián)的文件中讀取數(shù)據(jù)。所有read方法如果讀取到文件的末尾,都會(huì)返回-1。遇到-1就代表文件中的數(shù)據(jù)已經(jīng)被讀取完畢。

  public int read(byte[] byte):調(diào)用一次,讀取多個(gè)字節(jié)數(shù)據(jù),把讀到的字節(jié)數(shù)據(jù)保存在傳遞的byte字節(jié)數(shù)組中。返回字節(jié)數(shù)組中讀取的字節(jié)個(gè)數(shù)。注意:這個(gè)返回值不是數(shù)組長(zhǎng)度。

  注意:close方法,當(dāng)完成流的操作時(shí),必須調(diào)用此方法,釋放系統(tǒng)資源。

三:字符流

  1)字符輸入流 Reader

  public void close() :關(guān)閉此流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。

  public int read(): 調(diào)用一次讀取一個(gè)字符,返回字符的編碼值。即讀取的內(nèi)容存放到返回值中。如果讀取到文件末尾返回-1;

  public int read(char[] chs):調(diào)用一次讀取多個(gè)字符,把這些字符保存在chs中,返回給字符數(shù)組中存儲(chǔ)的字符個(gè)數(shù),如果讀取到文件末尾返回-1;

  注意:雖然讀取了一個(gè)字符,但是會(huì)自動(dòng)提升為int類型。

  2)字符輸出流 Writer

  public abstract void close() :關(guān)閉此輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。

  public abstract void flush() :刷新此輸出流并強(qiáng)制任何緩沖的輸出字符被寫出。

  public void write(int b) :寫出一個(gè)字符。

  public void write(char[] chs):將字符從指定的字符數(shù)組寫出此輸出流。

  public abstract void write(char[] b, int off, int len) :從指定的字符數(shù)組寫出 len字符,從偏移量 off開始輸出到此輸出流。

  public void write(String str) :寫出一個(gè)字符串。

  說明:字符輸入和字符輸出流都是自帶緩沖區(qū)的。緩沖區(qū)就是在類的底層封裝了一個(gè)數(shù)組,如果我們使用字符輸出流向目的地文件中寫數(shù)據(jù)的時(shí)候,數(shù)據(jù)不會(huì)立刻寫到目的地文件中,而是寫到自帶的數(shù)組中,數(shù)據(jù)還在內(nèi)存中,所以我們必須調(diào)用FileWriter類中的刷新方法flush將數(shù)組中的數(shù)據(jù)刷新到目的地硬盤文件中。

  注意:

  1. 雖然參數(shù)為int類型四個(gè)字節(jié),但是只會(huì)保留一個(gè)字符的信息寫出。

  2. 未調(diào)用close方法,數(shù)據(jù)只是保存到了緩沖區(qū),并未寫出到文件中。


猜你喜歡:
  
Java高級(jí)軟件工程師課程

  什么是敏捷開發(fā)?十分鐘了解 

  兩種常用的動(dòng)態(tài)代理方式 



分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!