Java之IO流學習總結 下

2021-07-25 06:14:32 字數 4177 閱讀 9595

2.位元組流

|-- inputstream(讀)

|-- outputstream(寫)

由於位元組是二進位制資料,所以位元組流可以操作任何型別的資料,值得注意的是字元流使用的是字元陣列char而位元組流使用的是位元組陣列byte。下面來看乙個位元組流讀寫檔案的簡單例子。

清單7,使用位元組流讀寫文字檔案**  

private static void test5()catch(ioexception e)finallycatch(ioexception ex) 

fileinputstream fis=null; 

trycatch(ioexception e)finallycatch(ioexception ex) 

清單8,使用緩衝區對一張進行複製**  

private static void test6() 

bos.flush(); 

}catch(ioexception e)finally 

if(bis!=null) 

}catch(ioexception ex) 

3.轉換流

特點

|--是位元組流和字元流之間的橋梁

|--該流物件可以對讀取到的位元組資料進行指定編碼表的編碼轉換

何時使用

|--當位元組和字元之間有轉換動作時

|--流操作的資料需要進行編碼表的指定時

具體物件體現

|--inputstreamreader:位元組到字元的橋梁

|--outputstreamwriter:字元到位元組的橋梁

說明

這兩個流物件是字元流體系中的成員,它們有轉換的作用,而本身又是字元流,

所以在new的時候需要傳入位元組流物件。

建構函式

|--inputstreamreader(inputstream)

通過該建構函式初始化,使用的是系統預設的編碼表gbk。

|--inputstreamreader(inputstream,string charset)

通過該建構函式初始化,可以通過charset引數指定編碼。

|--outputstreamwriter(outputstream)

使用的是系統預設的編碼表gbk。

|--outputstreamwriter(outputsream,string charset)

通過該建構函式初始化,可以通過引數charset指定編碼。

操作檔案的字元流物件是轉換流的子類

|--reader

|--inputstreamreader**換流)

|--filereader(檔案字元流)

|--writer

|--outputstreamwriter**換流)

|--filewriter(檔案字元流)

說明

轉換流中的read方法,已經融入了編碼表,在底層呼叫位元組流的

read方法時將獲取的乙個或者多個位元組資料進行臨時儲存,並去

查指定的編碼表,如果編碼沒有指定,則使用預設編碼表。

既然轉換流已經完成了編碼轉換的動作,對於直接操作的文本文

件的filereader而言,就不用再重新定義了,只要繼承該轉換

流,獲取其方法,就可以直接操作文字檔案中的字元資料了。

注意

在使用filereader操作文字資料時,該物件使用的是預設的編碼表,

如果要使用指定的編碼表,必須使用轉換流。

**體現

filereader fr=new filereader(「test.txt」);

inputstreamreader isr=new inputstreamreader(new

fileinputstreamreader(「test.txt」));

這兩句**意義相同,操作test.txt中的資料都是使用了系統預設

的編碼gbk。因為我們系統預設使用的編碼表是gbk,如果test.txt中

的資料是通過utf-8形式編碼的,那麼在讀取的時候就需要指定編碼表,

因此轉換流必須使用inputstreamreader isr=new

inputstreamreader(new fileinputstream(「a.txt」),」utf-8」);

四、流操作的基本規律

|--明確資料來源和資料匯(資料目的)

其實是為了明確是輸入流還是輸出流

|--明確操作的資料是否是純文字資料

|--說明

資料來源

鍵盤system.in、硬碟、file開頭的流物件、記憶體(陣列)。

資料匯

控制台system.out、硬碟、file開頭的流物件、記憶體(陣列)。

|--需求

將鍵盤錄入的資料儲存到乙個檔案中和列印到控制台

|--資料來源system.in

既然是源,使用的就是輸入流,可用的體系有inputstream

、reader。因為鍵盤錄入進來的一定是純文字資料,所以

可以使用專門操作字元資料的reader。而system.in對應

的流是位元組讀取流,所以要將其進行轉換,將位元組轉換成字

符即可,所以要使用reader體系中的inputstreamreader,

如果要提高效率,就使用bufferedreader,**如:

bufferedreader bur=new bufferedreader(new

inputstreamreader(sysem.in));

|--資料匯:乙個檔案、硬碟

資料匯一定是輸出流,可以用的體系有outputstream、

writer。往檔案中儲存的都是文字資料,那麼可以使用字元

流較為方便writer。因為操作的是乙個檔案,所以使用writer

中的filewriter,同理,要提高效率就要使用bufferedwriter。

**如:bufferedwriter bufr=new bufferedwriter(new

filewriter(「test.txt」));

清單9,將鍵盤錄入的資料儲存到乙個檔案中和列印到控制台**  

private static void test7()  

}catch(ioexception e)finally 

if(bur!=null) 

if(bw!=null) 

}catch(ioexception ex) 

清單9是按照預設編碼表寫入文字檔案的,那麼如何按照指定編碼表寫入檔案呢?其實也很簡單,將清單9的**稍微改一下就可以了。

清單10**  

private static void test8()  

}catch(ioexception e)finally 

if(bw!=null) 

}catch(ioexception ex) 

既然寫入檔案時指定了編碼,那麼在讀取的時候就必須指定該編碼才能正確顯示。

清單11,讀取指定編碼表的檔案**  

private static void test9()  

} catch (ioexception e) finally  

} catch (ioexception ex)  

寫入和讀取都做了,現在還差個複製操作,其實複製檔案也很簡單,先讀取檔案,再將讀取到的資料寫入檔案,不同的是,在讀取和寫入時我們可以指定編碼表。

清單12**  

private static void test11()  

} catch (ioexception e) finally  

if (bur != null)  

} catch (ioexception ex)  

IO流學習總結(下) 轉換流(重要)

參考 大佬的部落格 分為兩種 inputstreamreader 位元組流轉字元流 outputstreamwriter 字元流轉位元組流 寫入資料 記憶體中的字元資料 字元流 outputstreamwriter 位元組流 網路傳輸 或檔案儲存 讀取資料 可以清楚地發現,不管如何操作,最終全部是以...

Java中IO流學習總結

位元組流 可以處理所有以bit為單位儲存的檔案,也就是說可以處理所有的檔案,但是在處理字元上的速度不如字元流 注 其實在各個不同的型別中,輸入流到輸出流的套路基本都一樣。那就拿最簡單的fileoutputstream來舉例子吧 從fileoutputstream到fileintputstream其實...

java學習之IO流2

讀取鍵盤輸入 示例1 下圖中第3行建立位元組讀取流物件,獲取鍵盤讀取流system.in。第4行使用位元組讀取流的read 方法來讀鍵盤資料。第5行進行輸出。private static void readkey1 throws ioexception 示例2 下圖中使用迴圈讀取鍵盤輸入的資料。當鍵...