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