一、IO流,什么是IO
I:Input
O:Ouput
通過io可以完成硬盤文件的讀寫操作,就可以稱作輸入流和輸出流
二、IO流的分類
JAVA中的IO操作主要依賴java.io包來實現,Java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標。該包主要包括五個類和一個接口:
五個類:File、InputStream、OutputStream、Reader、Wirter
一個接口:Serializable
上述三個常用的File類的構造方法,如果程序處理一個目錄或者文件,通常來說使用第一構造方法比較多。如果程序處理的是一個公共的目錄或者若干子目錄或文件,使用第二個和第三個構造方法比較多。
File類的主要方法有:
下邊的代碼構建了File類對象,并使用exists方法判斷該文件是否存在,存在刪除,不存在新建。
如果是多級目錄,則需要構建目錄:
獲取文件屬性
執行結果:
是否是文件:true
是否是目錄:false
文件大小:0.00M
文件修改時間:2022-06-04 14:37:39
字節流和字符流
在介紹字節流和字符流之前,我們需要知道「字節」和「字符」的關系:
1字符=2字節;
1字節(byte)=8位;
一個漢字占兩個字節長度(因為漢字博大精深,所以有些漢字也會占到「三個字節」的長度);
「字節流」:每次讀取(寫出)一個字節,當傳輸的「資源文件」有中文時,就會出現亂碼;
「字符流」:每次讀取(寫出)兩個字節,有中文時,使用該流就可以正確傳輸顯示中文;
通常情況下,File類可以用來判斷文件或獲得文件屬性,而文件內容的處理則可以借助字節流和字符流。
1.字節流:InputStream、OutputStream
2.字符流:Reader、Writer
字節流
InputStream & OutputStream類
InputStream類是一個抽象類 ,是所有字節輸入流類的父類;
OutputStream類是一個抽象類,是所有字節輸出流的父類
InputStream常見子類有:
FileInputStream:看這個名字就知道用于從文件中讀取信息,
ByteArrayInputStream: 字節數組輸入流,
ObjectInputStream:序列化時使用 一般和ObjectOutputStream一起使用,
FilterInputStream: 過濾輸入流,為基礎的輸入流提供一些額外的操作;
OutputStream常見子類有
FileOutPutStream: 文件輸出流對文件進行操作,
ByteArrayOutputStream: 字節數組輸出流,
ObjectOutputStream: 序列化時使用 一般和OjbectInputStream一起使用,
FilterOutputStream:過濾輸出流,為基礎的輸出流提供一些額外的操作,
FileInputStream & FileOutPutStream
FileInputStream是文件字節輸入流,就是對文件數據以字節的方式來處理,如「音樂、視頻、圖片」等;
FileOutPutStream是「文件字節輸出流」
FileInputStream重要方法
FileOutputStream示例
字符流
InputStream/Reader: 所有的輸入流的基類,前者是字節輸入流,后者是字符輸入流;
OutputStream/Writer: 所有輸出流的基類,前者是字節輸出流,后者是字符輸出流;我們知道,流的作用就像是一個數據管道。字符流和字節流的處理單位不同,但處理方式相似。
字符流FileReader
字符流Writer
在處理流中有一個專門提供了一個內存區域用于輸入和輸出大批量內容的流——「緩沖流」(Buffered Stream):
如果每次操作都是以一個字節/字符為單位,顯然這樣的數據傳輸效率很低。為了提高數據傳輸效率,通常使用緩沖流,即為一個流配有一個「Buffer」,這個緩沖區就是專門用于傳送數據的一塊內存。
當向一個緩沖流寫入數據時,系統將數據發送到緩沖區,而不是直接發送到外部設備。緩沖區自動記錄數據,當緩沖區滿時,系統將數據「全部發送」到相應的外部設備。而且當從一個緩沖流中讀取數據時,系統實際是「從緩沖區中」讀取數據。當緩沖區空時,系統就會從相關外部設備自動讀取數據,并讀取盡可能多的數據填滿緩沖區。由此可見,緩沖流提供了內存與外部設備之間的數據傳輸效率;
緩沖流BufferReader
對于所有的包裝流來說,都只需要關閉最外層流就行,里面的節點流會自動關閉。
緩沖流BufferWriter
小結
看了上面的分類,會有讀者不清楚什么時候使用字節流,什么時候用輸出流。筆者在此整理這幾個步驟:
1.要知道是選擇輸入流還是輸出流。這就要根據自己的情況決定,如果想從程序寫東西到別的地方,那么就選擇輸入流,反之就選輸出流;
2.傳輸數據時,是每次傳一個字節還是兩個字節,每次傳輸一個字節就選字節流,如果存在中文,那肯定就要選字符流了。
關于javaIO流的知識就分享到這里,筆者能力有限,如果這篇文章對讀者有幫助,那就是對筆者最大的慰藉了!