java基礎之I/O流

流是我們程序與磁盤或內存交互的重要方式,我們可以通過流來進行讀或寫。首先我們可以根據讀寫的單位來對流進行分類,一是以字節爲單位進行讀寫的字節流,二是以字符爲單位進行讀寫的字符流。
I/O流文件層次

1 字節流

1.1 InputStream

InputStream是所有字節輸入流的父類。基本的讀取方法是:
-int read() 讀取一個字節
-int read(byte[] d)嘗試最多讀取給定的length個字節並存入該數組,返回值爲實際讀取到的字節量。

1.1.1 FileInputStream

FileInputStream是文件的字節輸入流,我們使用該流可以以字節爲單位從文件中讀取數據。它有兩個常用的構造方法,即
-FileInputStream(File file)
創建一個從指定File對象表示的文件中讀取數據的文件輸入流。
-FileInputStream(String name)
創建用於讀取指定文件系統中的路徑名name所指定的文件的文件輸入流。

1.1.2 BufferedInputStream

BufferedInputStream是緩衝字節輸入流,內部維護着一個緩衝區(字節數組)這樣就減少了讀取次數,從而提高了讀取效率。
public void testBis throws IOException{
FileInputStream fis=new FileInputStream("fis.txt");//用於讀取數據
BufferedInputStream bis=new BufferedInputStream(fis);
byte[] bytes=new byte[1024*10];
int d=-1;
while((d=bis.read(bytes))!=-1){//批量讀取
}
bis.close();
}

1.1.3 ObjectInputStream

ObjectInputStream是對對象進行反序列化的輸入流。實現對象反序列化的方法爲
-Object readObject()
該方法可以從流中讀取字節並轉換爲相應對象

1.2 OutputStream

OnputStream是所有字節輸出流的父類。
基本的寫出方法爲
-void write(int d) 寫出一個字節
-void write(byte[] d) 將給定字節數組中的字節全部寫出

1.2.1 FileOutputStream

FileOutputStream是文件的字節輸出流,我們使用該流可以以字節爲單位將數據寫入文件。常用的構造方法
-FileOutputStream(File file)
創建向指定File對象表示的文件中寫出數據的文件輸出流。
-FileOutputStream(String fileName)
創建向具有指定名稱的文件中寫出數據的文件輸出流。
若指定文件已經有內容,那麼使用該流對其寫入數據會將原數據全部清除。如果想要追加而不覆蓋掉原內容則需要使用以下構造方法
FileOutputStream(File file,boolean append)
FileOutputStream(String fileName,boolean append)
若第二個參數append爲true,那麼通過該流寫出的數據都是在文件末尾追加的。

1.2.2 BufferedOutputStream

BufferedInputStream是緩衝字節輸出流,內部維護着一個緩衝區。每當我們向該流寫數據時,都會先將數據存入緩衝區。當緩衝區已滿時,緩衝流會將數據一次性寫出。
public void testBos throws IOException{
FileOutputStream fos=new FileOutputStream("fos.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
//所有字節被存入緩衝區,等待一次性寫出
bos.write("helloword".getBytes());
//關閉流之前,緩衝輸出流會將緩衝區中內容一次寫出
bos.close();
}

使用緩衝輸出流可以提高寫出效率但寫出數據缺乏實時性,有時我們希望直接寫出而不是等緩衝區滿了才寫出。這時可以通過下面這個方法來實現。
-void flush() 清空緩衝區,將緩衝區數據強制寫出

1.2.3 ObjectOutputStream

對象是存在內存中的,有時候我們需要將對象保存在硬盤中,有時我們也需要將對象發送到另一臺計算機上等等的操作。這時我們需要將對象轉化爲一個字節序列。而對象轉爲字節序列的過程就稱爲對象序列化。而字節序列轉爲對象的過程就稱爲對象反序列化的過程。
ObjectOutputStream是對對象進行序列化的輸出流。實現對象序列化的方法爲:
- void writeObject(Object o)
ObjectOutputStream在進行對象序列化時需要序列化的對象所屬的類必須實現serializable接口。實現該接口並不需要重寫任何方法。只是作爲可序列化的標誌。

2 字符流

字符流是以字符爲單位讀寫數據的,其底層仍是字節流。

2.1 Reader

Reader是字符輸入流的父類。常用方法有
- int read() 讀取一個字節,返回的int值低十六位有效

2.1.1 InputStreamReader

InputStreamReader是字符輸入流(轉換流,能將字節流轉爲字符流)。其構造方法允許我們設置字符集。
-InputStreamReader(InputStream is,String charsetName)
示例代碼:

public class TestReader {
public static void main(String[] args) throws IOException{
FileInputStream fis=new FileInputStream("fos.txt");
InputStreamReader isr=new InputStreamReader(fis,"utf-8");
int d=-1;
while((d=isr.read())!=-1){
char c=(char) d;
System.out.print(c);
}
isr.close();
}
}

2.1.2 BufferedReader

BufferedReader是緩衝字符輸入流, 其內部提供了緩衝區,可以提高讀取效率。常用構造方法
-BufferedReader(Reader reader)
提供了一個可以讀取一行字符串的方法
-String readLine() 可以讀取一行字符串,直到讀到換行符

2.2 Writer

Writer是字符輸出流的父類。常用方法有
- void write(char[] chs)將給定字符數組中的所有字符寫出
- void write(String str) 將給定的字符串寫出

2.2.1 OutputStreamWriter

OutputStreamWriter是字節輸出流。構造方法爲
-OutputStreamWriter(OutputStream os,String charsetName)
示例代碼:
public class TestWriter {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream(“fos.txt”);
OutputStreamWriter osw=new OutputStreamWriter(fos,”utf-8”);//使用指定字符集
osw.write(“你好”);
osw.close();
}
}

2.2.2 PrintWriter

PrintWriter是具有自動行刷新的緩衝字符輸出流,提供了比較豐富的構造方法
-PrintWriter(File file)
-PrintWriter(String fileName)
-PrintWriter(OutputStream os,boolean autoFlush)
-PrintWriter(OutputStream os)
-PrintWriter(Writer writer,boolean autoFlush)
-PrintWriter(Writer writer)
其中布爾值的參數表示PrintWriter是否具有行刷新
PrintWriter提供了豐富的重載print與println方法,若PrintWriter是具有自動行刷新的,那麼每當通過println寫出的內容都會被實際寫出而不是緩存。
示例代碼:
public class TestPrintDemo2 {
public static void main(String[] args) throws IOException{
//向pw.txt文件中寫入字節
FileOutputStream fos=new FileOutputStream(“pw.txt”);
//將字符按照指定編碼集轉化爲字節
OutputStreamWriter osw=new OutputStreamWriter(fos,”utf-8”);
//提高寫效率,可以以行爲單位寫出字符串
PrintWriter pw=new PrintWriter(osw,true);
/*
* 當printwriter帶有自動行刷新時,
* 調用Println方法寫出字符串會自動flush
*/
pw.println(“大家好”);
pw.println(“纔是真的好”);
pw.println(“廣州好迪”);
pw.close();
}
}

發佈了27 篇原創文章 · 獲贊 20 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章