IO流

一、IO流

1、概述:IO流用來處理設備之間的數據傳輸(讀寫,複製)

2、分類:

按照流向分:輸入流(讀數據),輸出流(寫數據);

按照數據類型:字節流,字符流

字節輸入流:InputStream(抽象類) ---> FileInputStream ---> BufferedInputStream

  字節輸出流:OutputStream(抽象類) ---> FileOutputStream ---> BufferedOutputStream

  字符輸入流:Reader(抽象類) ---> InputStreamReader ---> FileReader ---> BufferedReader

  字符輸出流:Writer(抽象類) ---> OutputStreamWriter ---> FileWriter ---> BufferedWriter

二、FileOutputStream和FileInputStream

1、FileOutputStream —— 字節輸出流

1)創建字節輸出流對象:

構造方法:throws FileNotFoundException

public FileOutputStream(File file):指定一個File對象

public FileOutputStream(String name):直接指定文件名稱

public FileOutputStream(File file, boolean append):如果append是true,則將字節寫入文件末尾處,而不是改變原來的從頭寫;

2)寫數據:throws IOException

public void write(int b):寫入一個字節

public void write(byte[] b):寫一個字節數組

常用到String類的一個getBytes()方法,將字符串轉換成字節數組

public void write(byte[] b, int index,int len):寫一個字節數組的一部分,從index索引開始,寫len個長度

3)釋放資源:throws IOException

fos.close();

2、FileInputStream —— 字節輸入流

1)創建字節輸入流對象:

構造方法:throws FileNotFoundException

FileInputStream(File file):指定一個File對象

FileInputStream(String name):直接指定文件名稱

2)讀數據

A:public int read():一次讀取一個字節,返回下一個數據字節;如果已到達文件末尾,則返回 -1

int by = 0;

while((by = fis.read()) != -1){ //循環中只能出現一次read()方法,不然遍歷不全

System.out.println((char)by); //所以這裏不能再是(char)fis.read()

}

B:public int read(byte[] b):一次讀取一個字節數組,返回讀入緩衝區的字節總數,如果已到達文件末尾,則返回 -1。 

byte[] arr = new byte[1024]; //給定字節數組的長度是1024或者1024的倍數

int by = 0;

while((by = fis.read(arr)) = -1){ //相當於,把字節存入到了arr內

System.out.println(new String(arr,0,by));

}

3)釋放資源:throws IOException

fis.close();

三、BufferedOutputStream和BufferedInputStream —— 字節緩衝流(高效流)

1、優點:讀取,寫入速度快

2、構造方法:緩衝流只是爲了高效而設計的,只是構造了一個緩衝區,要進行讀寫操作還需要使用基本的流對象!

public BufferedOutputStream(OutputStream out):推薦使用第一種

  public BufferedOutputStream(OutputStream out, int size):指定一個緩衝區大小

public BufferedInputStream(InputStream in)

public BufferedInputStream(InputStream in,int size)

3、注意事項:

1)在字節緩衝輸入流中,在同一個對象中:要麼一次讀取一個字節,要麼就是一次讀取一個字節數組,不能同時使用;

2)在創建對象時,OutputStream:本身是抽象類,不能直接實例化,一般使用抽象類的多態用匿名的方式添加參數;

egg: BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("e:a.txt"));

四、OutputStreamWriter和InputStreamReader —— 轉換流(字節流通向字符流的橋樑)

1、OutputStreamWriter

1)構造方式:字符流 = 字節流 + 編碼表 (將字節流轉換成字符流

public OutputStreamWriter(OutputStream out):默認編碼:採用的格式:gbk格式

public OutputStreamWriter(OutputStream out,Charset cs):指定編碼表

指定一個編碼表:常用的兩種格式:gbk/utf-8,一般情況下一律採用默認格式

附:常見的編碼表

ASCII碼錶 'a' 97; 'A' 65; '0' 48

ISO-8859-1 拉丁碼錶 由八位表示一個數據

gb2311 中文編碼表

gbk 中文編碼表升級,融合了很多中文字符,一個漢字對應兩個字節

gb18030 gbk的取代版

BIG-5 大五碼 香港澳門地區使用的一些繁體字

UTF-8 ASCII碼錶兼容,最多包含三個字節

Unicode 國際標準碼,UTF-8兼容

2)常用方法:

5個寫數據的方法

public void write(int c):寫單個字符

public void write(char[] cbuf):寫一個字符數組

public abstract void write(char[] cbuf,  int off,int len):字符數組的一部分

public void write(String str):寫字符串

public void write(String str, int off,int len):寫字符串的一部分

刷新方法

public void flush()throws IOException 刷新該流的緩衝。

3)fiush()和close()的區別

flush():刷新緩衝的流,刷新之後,還可以給文件中寫數據

close():關閉跟該流相關的資源,並且關閉之前,一定要刷新,防止出現沒有寫進去的情況,關閉之後不能在寫數據了!

2、InputStreamReader

1)構造方法:

public InputStreamReader(InputStream in):默認的編碼格式

public InputStreamReader(InputStream in,String charsetName):指定的編碼格式,用什麼編碼格式寫的就要用什麼讀,不然會出現亂碼

2)常用讀取方法:

public int read():讀取單個字符

  public int read(char[] cbuf, int offset,int length):讀取字符數組(讀取的是實際長度)

3、FileWriter和FileReader —— 便捷類

extends OutputStreamWriter InputStreamReader

1)FileWriter用來寫入字符文件的便捷類

public FileWriter(File file)

public FileWriter(File file,boolean append) 如果append爲true 則將數據寫入文件末尾處,而不是寫入文件開始處

public FileWriter(String fileName)

public FileWriter(String fileName,boolean append)

2)FileReader用來讀取字符文件的便捷類

public FileReader(File file)

public FileReader(String fileName)

3)便捷類與轉換流的區別

轉換流只能傳入一個字節流作爲參數,將字節流轉換爲字符流;

便捷類可以直接傳入一個文件或者File對象,直接封裝成了字符流;

五、BufferedWriter和BufferedReader —— 字符緩衝流(高效流)

1、構造方法:

只能傳入字符流作爲參數,只是構造了一個緩衝區,要進行讀寫操作還需要使用基本的流對象!

2、特有方法:

字符緩衝輸出流的特殊方法

  public void newLine()throws IOException :寫入一個行的分隔符號!(相當於回車/r/n)

  字符緩衝輸入流的特殊方法:

  public String readLine()throws IOException:一次讀取一行:

  包含該行內容的字符串,不包含任何行終止符,如果已到達流末尾,則返回 null 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章