更新時間:2022-09-27 09:49:38 來源:動力節點 瀏覽119次
在Java的學習中,大家會學到IO流,對常用IO流也有一些了解,那么,io輸入輸出流是什么?動力節點小編來為大家進行詳細介紹。
java io可以讓我們用標準的讀寫操作來完成對不同設備的讀寫數據工作.
java將IO按照方向劃分為輸入與輸出,參照點是我們寫的程序.
輸入:用來讀取數據的,是從外界到程序的方向,用于獲取數據.
輸出:用來寫出數據的,是從程序到外界的方向,用于發送數據.
java將IO比喻為"流",即:stream. 就像生活中的"電流","水流"一樣,它是以同一個方向順序移動的過程.只不過這里流動的是字節(2進制數據).所以在IO中有輸入流和輸出流之分,我們理解他們是連接程序與另一端的"管道",用于獲取或發送數據到另一端.
java.io.InputStream:所有字節輸入流的超類,其中定義了讀取數據的方法.因此將來不管讀取的是什么設備(連接該設備的流)都有這些讀取的方法,因此我們可以用相同的方法讀取不同設備中的數據
java.io.OutputStream:所有字節輸出流的超類,其中定義了寫出數據的方法.
節點流:也稱為低級流.節點流的另一端是明確的,是實際讀寫數據的流,讀寫一定是建立在節點流基礎上進行的.
處理流:也稱為高級流.處理流不能獨立存在,必須連接在其他流上,目的是當數據流經當前流時對數據進行加工處理來簡化我們對數據的該操作.
實際應用中,我們可以通過串聯一組高級流到某個低級流上以流水線式的加工處理對某設備的數據進行讀寫,這個過程也成為流的連接,這也是IO的精髓所在.
文件流
文件流是一對低級流,用于讀寫文件數據的流.用于連接程序與文件(硬盤)的"管道".負責讀寫文件數據.
文件輸出流:java.io.FileOutputStream
文件流創建時,如果該文件不存在會自動將其創建(前提是該文件所在目錄必須存在!)
塊讀寫的文件復制操作
int read(byte[] data) 一次性從文件中讀取給定的字節數組總長度的字節量,并存入到該數組中。 返回值為實際讀取到的字節量。若返回值為-1則表示讀取到了文件末尾。
塊寫操作 void write(byte[] data) 一次性將給定的字節數組所有字節寫入到文件中
void write(byte[] data,int offset,int len) 一次性將給定的字節數組從下標offset處開始的連續len個字節寫入文件
寫文本數據
String提供方法: byte[] getBytes(String charsetName) 將當前字符串轉換為一組字節
參數為字符集的名字,常用的是UTF-8。 其中中文字3字節表示1個,英文1字節表示1個。
文件輸出流-追加模式
重載的構造方法可以將文件輸出流創建為追加模式
FileOutputStream(String path,boolean append)
FileOutputStream(File file,boolean append)
當第二個參數傳入true時,文件流為追加模式,即:指定的文件若存在,則原有數據保留,新寫入的數據會被順序的追加到文件中
緩沖流
java.io.BufferedOutputStream和BufferedInputStream.
緩沖流是一對高級流,作用是提高讀寫數據的效率.
緩沖流內部有一個字節數組,默認長度是8K.緩沖流讀寫數據時一定是將數據的讀寫方式轉換為塊讀寫來保證讀寫效率.
關閉流時只需要關閉高級流即可,它會自動關閉它連接的流
緩沖輸出流寫出數據時的緩沖區問題
通過緩沖流寫出的數據會被臨時存入緩沖流內部的字節數組,直到數組存滿數據才會真實寫出一次
緩沖流的flush方法用于強制將緩沖區中已經緩存的數據一次性寫出。
注:該方法實際上實在字節輸出流的超類OutputStream上定義的,并非只有緩沖
輸出流有這個方法。但是實際上只有緩沖輸出流的該方法有實際意義,其他的流實現
該方法的目的僅僅是為了在流連接過程中傳遞flush動作給緩沖輸出流。
java.io.ObjectOutputStream和ObjectInputSteam
對象流是一對高級流,在流連接中的作用是進行對象的序列化與反序列化。
對象序列化:將一個java對象按照其結構轉換為一組字節的過程
對象反序列化:將一組字節還原為java對象(前提是這組字節是一個對象序列化得到的字節)
Object readObject()
該方法會進行對象的反序列化,如果對象流通過其連接的流讀取的字節分析并非
是一個java對象時,會拋出異常:ClassNotFoundException
需要進行序列化的類必須實現接口:java.io.Serializable 實現序列化接口后最好主動定義序列化版本號這個常量。 這樣一來對象序列化時就不會根據類的結構生成一個版本號,而是使用該固定值。 那么反序列化時,只要還原的對象和當前類的版本號一致就可以進行還原。
transient關鍵字可以修飾屬性,用于在進行對象序列化時忽略不必要的屬性,達到對象瘦身的目的
字符流
java將流按照讀寫單位劃分為字節流與字符流.
java.io.InputStream和OutputStream是所有字節流的超類
而java.io.Reader和Writer則是所有字符流的超類,它們和字節流的超類是平級關系.
Reader和Writer是兩個抽象類,里面規定了所有字符流都必須具備的讀寫字符的相關方法.
字符流最小讀寫單位為字符(char),但是底層實際還是讀寫字節,只是字符與字節的轉換工作由字符流完成.
java.io.InputStreamReader和OutputStreamWriter
它們是字符流非常常用的一對實現類同時也是一對高級流,實際開發中我們不直接操作它們,但是它們在流連接中是非常重要的一環.
轉換流的意義:
實際開發中我們還有功能更好用的字符高級流.但是其他的字符高級流都有一個共通點:不能直接連接在字節流上.而實際操作設備的流都是低級流同時也都是字節流.因此不能直接在流連接中串聯起來.轉換流是一對可以連接在字節流上的字符流,其他的高級字符流可以連接在轉換流上.在流連接中起到"轉換器"的作用(負責字符與字節的實際轉換)
緩沖字符輸出流:java.io.PrintWriter
java.io.BufferedWriter和BufferedReader
緩沖字符流內部也有一個緩沖區,讀寫文本數據以塊讀寫形式加快效率.并且緩沖流有一個特別的功能:可以按行讀寫文本數據.
java.io.PrintWriter具有自動行刷新的緩沖字符輸出流,實際開發中更常用.它內部總是會自動連接BufferedWriter作為塊寫加速使用.
PrintWriter的自動行刷新功能
如果實例化PW時第一個參數傳入的是一個流,則此時可以再傳入一個boolean型的參數,此值為true時就打開了自動行刷新功能。 即: 每當我們用PW的println方法寫出一行字符串后會自動flush.
緩沖字符輸入流:java.io.BufferedReader
是一個高級的字符流,特點是塊讀文本數據,并且可以按行讀取字符串。
BufferedReader提供了一個讀取一行字符串的方法:
String readLine()
該方法會返回一行字符串,返回的字符串不含有最后的換行符。
當某一行是空行時(該行內容只有一個換行符)則返回值為空字符串。
如果流讀取到了末尾,則返回值為null。
提交申請后,顧問老師會電話與您溝通安排學習