Java中IO流概述
1.InputStream 和 OutputStream 繼承結(jié)構(gòu)圖:

2.Reader 和 Writer 繼承結(jié)構(gòu)圖:

3. 內(nèi)容
3.1 Java 流概述
文件通常是由一連串的字節(jié)或字符構(gòu)成,組成文件的字節(jié)序列稱為字節(jié)流,組成文件的字符
序列稱為字符流。Java 中根據(jù)流的方向可以分為輸入流和輸出流。輸入流是將文件或其它輸入
設(shè)備的數(shù)據(jù)加載到內(nèi)存的過程;輸出流恰恰相反,是將內(nèi)存中的數(shù)據(jù)保存到文件或其他輸出設(shè)
備,詳見下圖:

文件是由字符或字節(jié)構(gòu)成,那么將文件加載到內(nèi)存或再將文件輸出到文件,需要有輸入和輸出
流的支持,那么在 Java 語言中又把輸入和輸出流分為了兩個,字節(jié)輸入和輸出流,字符輸入
和輸出流。
3.2InputStream(字節(jié)輸入流)
InputStream 是字節(jié)輸入流,InputStream 是一個抽象類,所有繼承了 InputStream 的類都是
字節(jié)輸入流,主要方法:
void close() 關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源。 abstract int read() 從輸入流讀取下一個數(shù)據(jù)字節(jié)。 int read(byte[] b) 從輸入流中讀取一定數(shù)量的字節(jié)并將其存儲在緩沖 區(qū)數(shù)組 b 中。 int read(byte[] b, int off, int len) 將輸入流中最多 len 個數(shù)據(jù)字節(jié)讀入字節(jié)數(shù)組。
3.3 OutputStream(字節(jié)輸出流)
所有繼承了 OutputStream 都是字節(jié)輸出流
void close() 關(guān)閉此輸出流并釋放與此流有關(guān)的所有系統(tǒng)資源。 void flush() 刷新此輸出流并強(qiáng)制寫出所有緩沖的輸出字節(jié)。 void write(byte[] b) 將 b.length 個字節(jié)從指定的字節(jié)數(shù)組寫入此輸出 流。 void write(byte[] b, int off, int len) 將指定字節(jié)數(shù)組中從偏移量 off 開始的 len 個字 節(jié)寫入此輸出流。 abstract void write(int b) 將指定的字節(jié)寫入此輸出流。
3.4 Reader(字符輸入流)
abstract void close() 關(guān)閉該流。 int read() 讀取單個字符。 int read(char[] cbuf) 將字符讀入數(shù)組。 abstract int read(char[] cbuf, int off, int len) 將字符讀入數(shù)組的某一部分。
3.5 Writer(字符輸出流)
Writer append(char c) 將指定字符追加到此 writer。 abstract void close() 關(guān)閉此流,但要先刷新它。 abstract void flush() 刷新此流。 void write(char[] cbuf) 寫入字符數(shù)組。 abstract void write(char[] cbuf, int off, int len) 寫入字符數(shù)組的某一部分。 void write(int c) 寫入單個字符。 void write(String str) 寫入字符串。 void write(String str, int off, int len) 寫入字符串的某一部分。
4.面試題
1.字節(jié)流和字符流的區(qū)別?
字符流和字節(jié)流的使用非常相似,但是實際上字節(jié)流的操作不會經(jīng)過緩沖區(qū)(內(nèi)存)而是直接操作文本本身的,而字符流的操作會先經(jīng)過緩沖區(qū)(內(nèi)存)然后通過緩沖區(qū)再操作文件以字節(jié)為單位輸入輸出數(shù)據(jù),字節(jié)流按照 8 位傳輸以字符為單位輸入輸出數(shù)據(jù),字符流按照 16 位傳
2.什么是 IO 流?
它是一種數(shù)據(jù)的流從源頭流到目的地。比如文件拷貝,輸入流和輸出流都包括了。輸入流從文件中讀取數(shù)據(jù)存儲到進(jìn)程(process)中,輸出流從進(jìn)程中讀取數(shù)據(jù)然后寫入到目標(biāo)文件。
3.有哪些可用的 Filter 流?
在 java.io 包中主要由 4 個可用的 filter Stream。兩個字節(jié) filter stream,兩個字符 filter stream. 分別是 FilterInputStream, FilterOutputStream, FilterReader and FilterWriter.這些類是抽象類,不能被實例化的。
4.Java 中有幾種類型的流?
按照流的方向:輸入流(inputStream)和輸出流(outputStream)按照實現(xiàn)功能分:節(jié)點流(可以從或向一個特定的地方(節(jié)點)讀寫數(shù)據(jù)。如 FileReader)和處理流(是對一個已存在的流的連接和封裝,通過所封裝的流的功能調(diào)用實現(xiàn)數(shù)據(jù)讀寫。如 BufferedReader。處理流的構(gòu)造方法總是要帶一個其他的流對象做參數(shù)。一個流對象經(jīng)過其他流的多次包裝,稱為流的鏈接。)按照處理數(shù)據(jù)的單位: 字節(jié)流和字符流。字節(jié)流繼承于 InputStream 和 OutputStream, 字符流繼承于 InputStreamReader 和 OutputStreamWriter 。
5.如何實現(xiàn)對象克???
有兩種方式:1). 實現(xiàn) Cloneable 接口并重寫 Object 類中的 clone()方法;2). 實現(xiàn) Serializable 接口,通過對象的序列化和反序列化實現(xiàn)克隆,可以實現(xiàn)真正的深度克隆
6.什么是緩沖區(qū)?有什么作用?
緩沖區(qū)就是一段特殊的內(nèi)存區(qū)域,很多情況下當(dāng)程序需要頻繁地操作一個資源(如文件或數(shù)據(jù)庫)則性能會很低,所以為了提升性能就可以將一部分?jǐn)?shù)據(jù)暫時讀寫到緩存區(qū),以后直接從此區(qū)域中讀寫數(shù)據(jù)即可,這樣就可以顯著的提升性能。對于 Java 字符流的操作都是在緩沖區(qū)操作的,所以如果我們想在字符流操作中主動將緩沖區(qū)刷新到文件則可以使用 flush() 方法操作。
總結(jié)
到此這篇關(guān)于Java中IO流概述的文章就介紹到這了,更多相關(guān)Java中IO流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決@Cacheable在同一個類中方法調(diào)用不起作用的問題
這篇文章主要介紹了解決@Cacheable在同一個類中方法調(diào)用不起作用的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
java定位死鎖的三種方法(jstack、Arthas和Jvisualvm)
這篇文章主要給大家介紹了關(guān)于java定位死鎖的三種方法,分別是通過jstack定位死鎖信息、通過Arthas工具定位死鎖以及通過 Jvisualvm 定位死鎖,文中還介紹了死鎖的預(yù)防方法,需要的朋友可以參考下2021-09-09
Java File類 mkdir 不能創(chuàng)建多層目錄的解決
這篇文章主要介紹了Java File類 mkdir 不能創(chuàng)建多層目錄的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Dubbo?LoadBalance基于權(quán)重的隨機(jī)負(fù)載均衡算法提高服務(wù)性能
這篇文章主要為大家介紹了Dubbo?LoadBalance基于權(quán)重的隨機(jī)負(fù)載均衡算法提高服務(wù)性能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-10-10
Java使用wait() notify()方法操作共享資源詳解
這篇文章主要為大家詳細(xì)介紹了Java使用wait() notify()方法操作共享資源,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
使用Apache Spark進(jìn)行Java數(shù)據(jù)分析的步驟詳解
今天我們將探討如何使用Apache Spark進(jìn)行Java數(shù)據(jù)分析,Apache Spark是一個強(qiáng)大的大數(shù)據(jù)處理引擎,它支持批處理和流處理,特別適合處理大規(guī)模數(shù)據(jù)集,在Java中使用Spark,我們可以利用其強(qiáng)大的數(shù)據(jù)處理能力來進(jìn)行各種數(shù)據(jù)分析任務(wù),需要的朋友可以參考下2024-07-07
SpringBoot整合達(dá)夢數(shù)據(jù)庫的教程詳解
這篇文章主要給大家介紹了SpringBoot整合達(dá)夢數(shù)據(jù)庫的詳細(xì)教程,文章中有詳細(xì)的圖片介紹和代碼示例供大家參考,具有一定的參考價值,需要的朋友可以參考下2023-08-08
搭建 springboot selenium 網(wǎng)頁文件轉(zhuǎn)圖片環(huán)境的詳細(xì)教程
這篇文章主要介紹了搭建 springboot selenium 網(wǎng)頁文件轉(zhuǎn)圖片環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
解決工具接口調(diào)用報錯:error:Unsupported Media Type問題
當(dāng)遇到"UnsupportedMediaType"錯誤時,意味著HTTP請求的Content-Type與服務(wù)器期望的不匹配,比如服務(wù)器期待接收J(rèn)SON格式數(shù)據(jù),而發(fā)送了純文本格式,常見的Content-Type類型包括text/html、application/json、multipart/form-data等2024-10-10

