更新時間:2022-09-26 10:07:19 來源:動力節(jié)點 瀏覽1377次
IO 幾種常見的流:
I/O 流原理功能
Input/Output:輸入輸出機制
輸入機制:允許java程序從外部設(shè)備(磁盤、光盤、網(wǎng)絡(luò)等)獲取數(shù)據(jù)。
輸出機制:保留java程序中的數(shù)據(jù),輸出到外部設(shè)備(磁盤、CD等)。
以不同的方式,您可以進行分類。
1.按功能劃分:
輸入流:只能從中讀取數(shù)據(jù),而不是向其寫入數(shù)據(jù)。
輸出流:只能寫入數(shù)據(jù),不能從中讀取數(shù)據(jù)。
2.按處理單元劃分
字節(jié)流和字符流的操作方式基本相同。操作的數(shù)據(jù)單位不同
字節(jié)流:操作為 8 Bytes of bits InputStream/OutputStream 作為字節(jié)流的基類
字符流:操作為 16 個字符 Reader/Writer 作為字符流的基類
關(guān)于字節(jié)流和字符流的區(qū)別?
當(dāng)讀取一個字節(jié)流時,讀取一個字節(jié)并返回一個字節(jié)。字符流使用字節(jié)流讀取一個或多個字節(jié)(中文對應(yīng)字節(jié)為兩個,UTF-8碼表中有三個)時,首先查看指定的
編碼表,將找到的字符返回給。
字節(jié)流可以處理所有類型的數(shù)據(jù),例如圖片、mp3、視頻等。字符流只能處理字符數(shù)據(jù)。
字節(jié)流和輸入流均以 InputStream 結(jié)尾,字節(jié)輸出流均以 OutputStream 結(jié)尾。在 InputStream 或者 OutputStream 前面代表這個流的功能。
字符流輸入流以Reader結(jié)尾,字符輸出流以Writer結(jié)尾,同一字符流前面的字符代表流的功能。
其實字節(jié)流本身在操作的時候不會用到緩沖區(qū),直接操作的是文件本身,但是字符流在操作的時候會用到緩沖區(qū),文件是通過緩沖區(qū)來操作的。
用字節(jié)流還是字符流比較好?
答:字節(jié)流,因為硬盤上的所有文件都是以字節(jié)的形式傳輸或保存的,包括圖片等。但是字符流只是在內(nèi)存中形成的,所以在實際開發(fā)中,字節(jié)流的使用更為廣泛。
摘要:如果是處理純文本數(shù)據(jù),我們必須優(yōu)先考慮字符流,另外,它們都使用字節(jié)流。
節(jié)點流:可以直接從/讀取到外部設(shè)備/寫入數(shù)據(jù)的流,這稱為節(jié)點流,節(jié)點流也稱為低級流。
處理流程:連接和封裝現(xiàn)有流程,擴展原有的讀/寫功能。處理流程也稱為高級流程。
Java 的 io 包包括 40 多個流,它們都有密切的聯(lián)系和使用規(guī)則,這些流都來自 4 個抽象基類。
InputStream/Reader:所有輸入流的基類,前者為字節(jié)輸入流,后者為字符輸入流。
OutputStream/Writer:基本上都是所有的輸出流,前者是字節(jié)輸出流,后者是字符輸出流。
File 類起源:File Class 彌補了 IO 流的不足,IO 只能操作數(shù)據(jù),但不能對文件的信息進行操作,操作文件必須使用 File 類(Java File類概述)。
功能 :
一個。您可以將文件或文件夾拆分為程序中的對象。
灣。方便操作文件或文件夾中的屬性信息。
C。File Class 通常通過構(gòu)造函數(shù)作為參數(shù)傳遞給流的對象。
File類的常用方法:
1.構(gòu)造方法:
File(String pathname):這種構(gòu)造可以將現(xiàn)有或不存在的文件或文件夾封裝成 File 的對象,pathname 文件的路徑。
File(File parent,String child):parent by child 文件的路徑。
(1)文件路徑
文件 f6 = 新文件(“c:\java”,“jre7”);
//file 的 toString 方法被覆蓋,無論打包地址打印
//'/' 和 '\' 所有目錄分隔符,在其他系統(tǒng)中,目錄分隔符可以改變,這樣寫不利于跨平臺操作 // 最好使用 File分隔符 Segmentation 中提供的字段。
(2)創(chuàng)建文件相關(guān)功能:
createNewFile():創(chuàng)建相關(guān)文件。并返回布爾值
createTemFile(): 在默認(rèn)臨時文件目錄下創(chuàng)建一個空文件,程序運行后不存在。
mkdirs():創(chuàng)建目錄,如果你寫的目錄的父目錄不存在。他會幫你創(chuàng)作。
(3)刪除文件相關(guān)功能:
delete():刪除空目錄或文件(ps只能是空目錄)
deleteOnExit():虛擬機終止時刪除文件。
(4)裁判:
exists() :判斷文件或文件夾是否存在。
canExecute() :判斷文件是否可執(zhí)行,跟操作系統(tǒng)有關(guān)。
canRead() : 判斷文件是否可讀
canWrite() : 判斷文件是否可寫
equals(Object obj) : 測試抽象路徑名是否等于給定的對象。
isAbsolute() :測試這個抽象路徑名是否是絕對路徑名。
isDirectory() :判斷文件對象代表一個文件夾。
isFile() : 判斷文件對象代表一個文件
isHidden() : 判斷文件對象是否為隱藏文件
(5)獲取文件對象屬性信息的方法:
getAbsoluteFile() :返回這個抽象路徑名的絕對路徑名形式。
getAbsolutePath() :返回這個抽象路徑名的絕對路徑名字符串。
getCanonicalFile() :返回這個抽象路徑名的規(guī)范形式。
getCanonicalPath() :返回此抽象路徑名的規(guī)范路徑名字符串。
getPath() :將此抽象路徑名轉(zhuǎn)換為路徑名字符串。
getName() :返回此抽象路徑名表示的文件或目錄的名稱。
getParent() :返回此抽象路徑名的父目錄的路徑名字符串;如果沒有為此路徑名指定父目錄,則返回null。
getParentFile() :返回此抽象路徑名的父目錄的抽象路徑名;如果沒有為此路徑名指定父目錄,則返回null。
getTotalSpace() :返回指定路徑的總空間中的字節(jié)數(shù)
getFreeSpace() :返回此抽象路徑名指定的分區(qū)中未分配的字節(jié)數(shù)。
getUsableSpace() :返回此抽象路徑名指定的分區(qū)上此虛擬機可用的字節(jié)數(shù)。
renameTo(File dest) :重命名此抽象路徑名表示的文件。剪切
(6)如何設(shè)置文件信息:
setExecutable(boolean executable) :設(shè)置文件可執(zhí)行方法
setLastModified(long time) :設(shè)置此抽象路徑名指定的文件或目錄的最后修改時間。
setReadable(boolean readable) : 設(shè)置文件是否可讀
setReadOnly() : 設(shè)置文件是否只讀
setWritable(boolean writable) : 設(shè)置文件是否可寫
(7)如何獲取文件的一般信息:
lastModified() :獲取文件的最后修改時間
length() :返回這個抽象路徑名所代表的文件的長度。
(8)如何操作文件夾
list():將文件夾中包含的目錄和文件存儲到字符串?dāng)?shù)組中。
listFiles():列出文件夾中包含的目錄和文件,存放在 File 數(shù)組中。
listRoots():列出可用的文件系統(tǒng)根目錄。
(9)文件過濾器: FileFilter
布爾接受(文件路徑名);該接口的一個實例可以用來傳遞給 File 類的 listFiles(FileFilter) 方法,用來返回滿足過濾器要求的子
文件 File [] listFiles(FileFilter filter)
1. 節(jié)點流
字節(jié)數(shù)組流(內(nèi)存流)
ByteArrayInputStream
ByteArrayOutputStream
因為內(nèi)存輸出流中有新的方法,不要使用多態(tài),不能讓父類的引用指向那樣的東西。
效果:循環(huán)中可以將所有數(shù)據(jù)存儲在一個統(tǒng)一的容器中,然后在循環(huán)結(jié)束時,可以一起取出容器中的所有內(nèi)容。
注意事項:
內(nèi)存流屬于內(nèi)存中的資源,所以不要過度,如果太大,會出現(xiàn)內(nèi)存溢出錯誤。
2. 緩沖流量
緩沖字節(jié)流
BufferedInputStream
BufferedOutputStream
緩沖字符流
BufferedReader
BufferedWriter
處理流包含節(jié)點流,節(jié)點流決定與之通信的外部設(shè)備,處理流增加其功能。
緩沖流的好處:
緩沖流里面包含一個緩沖區(qū),默認(rèn)8kb,每次程序調(diào)用read方法實際上都是從緩沖區(qū)中讀取內(nèi)容,如果讀取失敗
則說明緩沖區(qū)中沒有內(nèi)容,然后從數(shù)據(jù)源,然后將盡可能多的字節(jié)讀取并放入緩沖區(qū),
最后將緩沖區(qū)的內(nèi)容,全部返回給程序。
從緩沖區(qū)讀取數(shù)據(jù)比直接從數(shù)據(jù)源讀取數(shù)據(jù)要快,效率更高,性能更好。
簡而言之:
沒有緩存,那么每讀一次,就會發(fā)送一次IO操作;有一個緩沖區(qū),第一次讀的時候,我會讀x個字節(jié)到緩存中,
然后read會從緩存中讀取,當(dāng)讀到緩沖區(qū)結(jié)束時,會再讀x個字節(jié)到緩存中。
流處理數(shù)據(jù)的方法與節(jié)點流處理方法基本相同。
3. 轉(zhuǎn)化流量
轉(zhuǎn)換流功能:將字節(jié)流轉(zhuǎn)換為字符流,可以解決編碼集和解碼集造成的亂碼問題。
輸入流讀取器:
輸出流編寫器:
code : character —– 編碼字符集 ——–》 二進制
decode : 二進制——解碼字符集 ———》 字符
在處理文件時,如果文件的字符格式與編譯器的不同,就會出現(xiàn)亂七八糟的情況。比如文件字符格式GBK,
而編譯器是UTF-8格式,那么問題就來了。
亂碼問題的原因:
(1)編碼和解碼字符集不一致導(dǎo)致亂碼
(2)丟失字節(jié),丟失長度
大多數(shù)情況下,出現(xiàn)亂碼問題的原因是漢字,因為漢字在不同的字符碼中占用不同的字節(jié),但都占用多個字節(jié)。
而英文字母則沒有這個問題,因為英文字母在所有字符編碼中占據(jù)一個字節(jié)。
InputStreamReader : Transform the input stream –》 Convert byte input stream to character input stream
效果:為了防止文件使用字符輸入流處理出現(xiàn)亂碼問題。
4.數(shù)據(jù)處理流程
DataOutputStream
DataInputStream
特性:可以保存數(shù)據(jù)本身,并且可以保存數(shù)據(jù)類型(基本數(shù)據(jù)類型+String)
5.序列化流程
將對象轉(zhuǎn)化為字節(jié)序列的過程,就是對象序列化的過程。
將字節(jié)序列恢復(fù)到對象的過程稱為對象反序列化。
效果:保持對象(引用數(shù)據(jù)類型data)類型+數(shù)據(jù)。
序列化流程: 輸出流 ObjectOutputStream writeObject()
反序列化流:輸入流 ObjectInputStream readObject()
注意事項:
先序列化,再反序列化,并且反序列化的順序必須和序列化的順序一致。
并非所有對象都可以序列化。只有當(dāng) Serializable 接口類的對象才能被序列化。
并非對象中的所有屬性都可以序列化。
對象序列化的主要目的:
將對象轉(zhuǎn)換為字節(jié)序列,保存到硬盤,持久化存儲,通常保存為文件。
在網(wǎng)絡(luò)上傳遞的是對象的字節(jié)序列
對象序列化步驟:
創(chuàng)建對象輸出流,其他輸出節(jié)點流可以包含在構(gòu)造方法中,如文件輸出流。
將對象通過 writeObject 來寫入。
對象反序列化步驟:
創(chuàng)建對象輸入流,構(gòu)造方法中可以包含其他輸入節(jié)點流,如文件輸入流
通過 readObject() 方法讀取對象。
serialVersionUID : 序列化版本 id
效果:字面意思,就是序列號。一切都實現(xiàn)了 Serializable 接口的類,會有一個默認(rèn)的靜態(tài)序列化ID。
不同版本之間的類,可以解決序列化兼容性的問題,如果一個對象在之前的版本中保存在一個文件中,那么版本升級后,如果序列化id一致,我們可以認(rèn)為文件中的對象還是對象這種。
如果類不希望不同版本之間兼容,但是我們也希望類的對象是有序的,那么在不同的版本id中使用不同的序列化。
瞬態(tài):當(dāng)類中有不想被序列化的屬性時,所以使用這個修飾符來修改。
以上就是關(guān)于“Java中的io流知識總結(jié)”介紹,對于初學(xué)者來說,可以看看本站的Java IO流的分類,對IO流有一個初步的認(rèn)識,這樣在以后的學(xué)習(xí)中會更加順暢。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743