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