第七章 流
目錄
第七章 流 1
7.1流的概念 2
1.流的概念 2
2.流的功能 2
3.關于流的注意問題 2
7.2 Java IO流分類 2
總分類 2
節點流和處理流 2
1.Java流支援的兩種類型的資料 2
2.按照讀寫資料的類型 2
3.InputStream 2
4.OutputStream 2
5.Reader 2
6.Writer 2
7.3節點流 2
7.3.1.節點流的分類 3
7.3.2檔案節點流 3
1.功能 3
2.執行個體 3
7.4 過濾流(處理流) 5
7.4.1工作原理 5
1.工作過程 5
2.Java的處理方法 6
7.4.2 緩沖流 7
1.定義 7
2.作用: 7
3.主要類: 7
4.具體實作 8
7.4.3 轉換流 8
1.功能 8
2.InputStreamReader&OutputStreamWriter 8
3.具體實作 9
7.4.4 資料流 9
1.作用: 9
2.主要接口和類 9
3.構造方法: 9
7.4.5 Print流 9
7.4.6 對象流 9
7.4.7總結 9
1.處理流的功能主要展現在 9
2.關閉流時的注意點 9
7.1流的概念
之前所學的Java程式所有的資料都是儲存在記憶體/JVM中,程式結束之後自動釋放,現在的大多數都是程式結束之後儲存到磁盤當中去,啟動程式會在當中讀出相關資料,相關操作就是通過流來實作的
【從程式的角度看】
流讀取資料:輸入流(可從中讀出一系列位元組的對象)
流寫入資料:輸出流(可向其中寫入一系列位元組的對象)
在Java中流也是對象
1.流的概念
來自源或送至目的地的資料流動,程式和I/O裝置或檔案之間進行傳輸的對象
2.流的功能
完成資料的輸入和輸出
3.關于流的注意問題
(1)Java中所有的輸入、輸出,都是通過流來完成的
(2)一個流是以另一個對象為源或目的傳輸資訊的對象,功能類似與一個管道
(3)執行個體:System.out
System.in
7.2 Java IO流分類
總分類
節點流和處理流
節點流:可以從一個特定的資料源讀取資料(直接從資料源讀取資料,讀回來的資料是類似01010)
處理流:連接配接已存在的流(節點流或處理流)之上,通過對已有流的處理為程式提高更強大的讀寫能力<讀寫01010等資訊,使其簡化>
1.Java流支援的兩種類型的資料
①原始位元組
②Unicode字元(會有轉換過程)
2.按照讀寫資料的類型
①位元組流(流)
②字元流(讀的流:閱讀器、輸出流:書寫器)
四個基本類(抽象類):
(Stream結尾是位元組流)
3.InputStream【輸入位元組流類】
(1)所有以位元組為機關的輸入流的基類
(2)操作的資料的基本機關:位元組(8bit)
(3)分類
(4)基本方法
①一次讀一個位元組回來
4.OutputStream【位元組輸出流】
(1)所有以位元組為機關輸出流的基類
(2)操作的資料的基本機關:位元組(8bit)
(3)分類
(4)基本方法
(5)說明
—flush将清空緩存,即将緩存的資料寫到檔案裡
—close是關閉檔案
—使某個流類提供了使用原生的read和write來工作的具體方法
5.Reader【字元輸入流】
(1)所有字元輸入流的基類
(2)操作的資料的基本機關:字元(16bit)
(3)分類
(4)基本方法
6.Writer【字元輸入流】
(1)所有字元輸入流的基類
(2)操作的資料的基本機關:字元(16bit)
(3)分類
(4)基本方法
7.Java流體系常用類的分類
7.3節點流
7.3.1.節點流的分類
節點流:直接從特定類型資料(資料源)實作讀寫的流
7.3.2檔案節點流
1.功能
連接配接檔案的輸入(輸出)流
2.執行個體
(1)Test File Input Stream
★功能:
從檔案中讀取位元組
★問題
①為何列印“?”,如何修改?
Java原檔案也是字元編碼的,要讀成位元組編碼的話一般隻會一次讀取一個位元組,如果不是一個位元組表示的字元,那就會亂碼 , <一個中文兩個位元組>
Java檔案時純文字檔案,使用字元流讀取就不會亂碼(字元流讀的也是位元組,隻是會自動将位元組轉化成字元,是以使用字元流讀取的時候就不會亂碼了)
②read()的傳回值為int
③總共讀取的位元組數(num)與檔案大小的關系?
相等
④異常處理
(2)Test File Reader
—功能:
列印出一個檔案中全部的字元(Unicode編碼)
(3)TestFileOutputStream
—File Output Stream對象建立時,若檔案不在,則會自動建立相應的檔案
(4)Test File Stream ToCopyMp3
功能
實作了mp3檔案的拷貝
問題:
①為何執行速度很慢?如何改進?
(5)TestFileWriter
功能
像另外一個檔案輸入大部分Unicode編碼
很多都是亂碼的原因:
FileWrite和FileRead都是隻能以系統預設的編碼格式讀寫檔案
7.4 過濾流(處理流)
7.4.1工作原理
1.工作過程
//位元組級的讀寫操作,沒有讀取數值類型資料的功能
FileInputStream fin=new FileInputStream(“a.txt”);
int b=fin.read;
//無法從檔案中讀取資料
DataInputStream din=…;
double s=din.readDouble();
2.Java的處理方法
(1)某些流從檔案或其他位置讀寫位元組;
某些流将位元組“組裝”成更有用的資料
(2)通過組成一個現成的流傳遞給另外一個流的構造器,形成“過濾流”
■說明:注意順序
—DataInputStream放到最後,是為了使用該類的方法;
—使用具有緩沖功能的read方法。
■優點: (1)隻要使用相同的處理流,程式則可以采用完全相同的輸入、輸出代碼來通路不同的資料源。
(2)提供了更加友善的操作,執行的效率更高;
(3)與節點流的搭配:各盡其職,擁有對流進行混合和比對的能力。
7.4.2 緩沖流
1.定義
套接在相應的節點流之上,對資料的讀寫提供了緩沖功能。.
2.作用:
提高了讀寫的效率。
3.主要類:
一BufferedInputStream
一BufferedOutputStream
一BufferedReader
一BufferedWriter
4.具體實作
執行個體1: Test BufferedInputStream
套接使用,需要參數,
雖然提供了緩沖功能,但是還是不可
以讀取中文
執行個體2: TestBufferReader
執行個體3: 拷貝MP3檔案:
CopyMp3WithBufferedStream
7.4.3 轉換流
1.功能
将位元組流轉換為字元流。
2.InputStreamReader&OutputStreamWriter
①InputStreamReader 需要與InputStream套接;
②OutputStreamWriter要與OutputStream套接。
③構造時可以指定編碼集合:
new InputStreamReader(System.in,“ISO8859_ 1”);
3.具體實作
(1)執行個體1: TestTransform
➢功能:讀取文本檔案(可正确讀取中文)
➢注意:讀取的字元總數。
(2)執行個體2: TestTransFormEncoding
(3)執行個體3:KeyboardInput
7.4.4 資料流
1.作用:
直接以基本類型為單元進行讀寫,提供了可以存取Java基本類型資料的方法。
2.主要接口和類
—接口: DataInput 、DataOutput
一實作類: DataInputStream、 DataOutputStream
3.構造方法:
一DataInputStream(InputStream in)
一DataOutputStream(OutputStream out )
例1: TestDataStream
7.4.5 Print流
7.4.6 對象流
7.4.7總結
1.處理流的功能主要展現在
(1) 性能的提高:主要以增加緩沖的方式來提高輸入輸出的效率;
(2) 操作的簡便:處理流提供了一系列便捷的方法來一次輸入、輸出大批量的内容,而不是輸入輸出一一個或多個位元組或字元。
2.關閉流時的注意點
使用處理流包裝了底層節點流後,關閉流時,隻要關閉最.上層的處理流,則被處理流包裝的節點流被自動關閉。