溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JAVA io輸入輸出流是什么

發(fā)布時間:2022-09-28 10:00:03 來源:億速云 閱讀:88 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“JAVA io輸入輸出流是什么”,在日常操作中,相信很多人在JAVA io輸入輸出流是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JAVA io輸入輸出流是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

JAVA IO

java io可以讓我們用標準的讀寫操作來完成對不同設(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定義了兩個超 類(抽象類):

java.io.InputStream:所有字節(jié)輸入流的超類,其中定義了讀取數(shù)據(jù)的方法.因此將來不管讀取的是什么設(shè)備(連接該設(shè)備的流)都有這些讀取的方法,因此我們可以用相同的方法讀取不同設(shè)備中的數(shù)據(jù)

java.io.OutputStream:所有字節(jié)輸出流的超類,其中定義了寫出數(shù)據(jù)的方法.

java將流分為兩類:節(jié)點流與處理流:

節(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ù)組從下標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)換工作由字符流完成.

轉(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。

到此,關(guān)于“JAVA io輸入輸出流是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI