關於輸入輸出流的學習總結

2021-07-24 17:07:15 字數 3865 閱讀 3201

個人的理解和總結:

首先要明確 輸入輸出 是對誰而言的?這裡是相對程式而言的,什麼是程式,就是你在編寫的東西。

所以輸入,就是程式從外部讀取資料,用inputstream、reader 裡的read、readlin等方法進行讀。

輸出,就是程式向外部寫出資料,用outputstream、writer 裡的writer、print等方法進行寫。

我們平常說的「往乙個檔案裡寫入資料」,這句話其實已經改變了相對的物件,聽起來像是寫入使用輸入,其實是錯誤的理解,這裡的寫入是相對檔案而言,所以改變了相對程式而言這個立場。這裡用程式的**來講恰恰叫做輸出,程式往檔案寫資料。

關於輸入輸出流的分類有大體有三種分發,按輸入輸出分,按是否和特定地方相連,按處理資料的單位分。

1.按輸入輸出 開頭就說了,要知道輸入輸出的相對立場。

2.按是否和特定地方相連,則分為節點流和處理流。節點流是最基本的流,處理流都是高階流。

自己學的節點流不多,主要就是和檔案相關的fileoutputstream、fileinputstream。

3.我從 按處理資料的單位分 這個點進行詳細講解。

a.位元組處理:

兩個最基本位元組流的抽象父類inputstream、outputstream

所有繼承自這兩個父類的都是處理位元組的流,因為這兩個都是抽象類,所以我們一般用他的繼承類。

這裡最基本的處理位元組的節點流分別是fileinputstream、fileoutputstream

fileinputstream:

構造:fileinputstream(file file)、fileinputstream(stringfilename)

主要方法:int read(int d)、int read(byte buf) 這裡和raf很類似,不再贅述。

fileoutputstream:

構造:fileoutputstream(file file)、fileoutputstream(stringfilename)

注意:區別於raf的寫,包括之後的流的寫,只要寫入不管寫入多長會直接將原有的檔案內容清空覆蓋,不會像raf寫入長度不夠進行保留覆蓋。

主要方法:void writer(int d) 低8位有效 、void writer(byte buf) 寫入乙個位元組陣列。

處理位元組的高階流:高階流需要乙個節點流作為引數

緩衝流:bufferedoutputstream、bufferedinputstream緩衝流的作用就是先將要讀要寫的內容放在乙個緩衝區,待緩衝區滿了進行資料的讀寫,這樣增加記憶體效率。當然,使用flush和close方法後就會清空緩衝區將區內的內容讀寫。

bufferedinputstream緩衝輸入流

構造:bufferedinputstream(fis)  方法同fileinputstream

bufferedoutputstream緩衝輸出流

構造:bufferedoutputstream(fos) 方法同fileoutputstream

所以可以這麼說 緩衝流的作用就是套在兩個節點流外面的,給他們進行加持作用的。

物件流:objectoutputstream、objectinputstream專門用來對物件進行儲存讀取的流,前提物件需要進行一次序列化,說白了就是實現乙個介面serializable,另外最好宣告乙個靜態最終長整型的成員變數作為版本號(具體幹嘛看文件,忘記了,反正這樣做沒錯)。

同樣因為這時乙個高階流,也需要用fis和fos作為其引數。

常用的兩個方法,輸出物件:oos.writerobject(object o)

輸入物件(讀物件):object o = ois.readobject();

字元處理

兩個最基本的字元流抽象父類:reader、writer

因為是字元流,故名思議,主要是對文字檔案進行讀寫操作比較合理,同時涉及到了字元,自然而言就會牽扯到編碼集。這兩個是抽象父類,所以我們也是使用實現類。

這裡學了基本的兩個轉換流,我個人覺得,從位元組處理到字元處理,應該是乙個機制的轉換,我且認為這兩個流算是高階流,因為它們的引數也需要用到fis和fos位元組處理流做乙個檔案的關聯。

兩個轉換流:inputstreareader、outputstreamwriter兩個轉換流的作用是相當於對位元組流的乙個關聯和公升級,因為他們的構造沒有直接用file的引數。

inputstreareader:

構造:inputstreareader(fis,string charsetname)  其中charsetname就是編碼集如:」gbk」、」utf-8」等

當然也可以不設定編碼集,則系統預設,看ide的預設編碼設定。

主要方法:int read() 返回的int是低16位有效、int read(char chs)  讀取字元陣列和位元組流類似,只是這裡是字元陣列,返回的int為實際讀到的字元個數。

outputstreamwriter:

構造:outputstreamwriter(fos, string charsetname)其中charsetname就是編碼即輸出字元的編碼形式,所以當輸入讀取資料時,必須和該檔案寫入的編碼一致,尤其中文。

主要方法:void writer(int c) 寫出int的低16位、voidwriter(char chs)、void writer(string)、voidwriter(char chs,int offset, int len)

接下來介紹兩個高階點的字元處理流:

printwriter : 具有自動重新整理功能的緩衝字元輸出流

構造:這個流比較強大,構造也比較多,非常實用

1.printwriter(file file)、printwriter(string filename) 、printwriter(filefile,string charsetname)直接使用檔案作為引數,同時還能夠為該次輸出定義編碼;

2.printwriter(outputstream out)、printwriter(outputstream out,booleanautoflush) 這裡使用了位元組處理流作為引數,其中autoflush即為自動重新整理功能,但是需要使用他的println()方法即以換行為標記,才能體現出重新整理效果。說白了自動給你flush()一下。

3.printwriter(writer writer)、printwriter(writer writer,boolean autoflush)這裡使用了字元處理流作為引數,同樣autoflush為自動重新整理功能。

這個輸出流實在太強大了,其構造非常方便我們選擇性的進行輸出操作,以及各種功能的選擇。

bufferedreader:快取字元輸入流,內部提供了緩衝區,可以提高讀取效率(其實還有乙個對應的bufferedwriter快取字元輸出流,也許因為printwriter實在強大,感覺沒必要使用這個流了

構造:bufferedreader(reader reader)

通過構造我們可以知道,其需要的引數是乙個字元輸入流,而字元輸入流需要乙個引數位元組輸入流,所以我們在新建該物件的時候至少需要套2層,才能得到該物件。

主要方法:除了一般的read()方法,該流有乙個string readline()方法 讀取檔案中的一行字元,以回車為標識,但是不將回車讀取。返回null,則表示讀完。可以使用while迴圈。

關於輸入輸出流的討論

今天看了下c 中的流,試著編寫了程式如下 include include include using namespace std 開始時的程式中向檔案中輸出資料時用的語句為oo st fri data sec data thi data 既沒有換行符,執行的結果如下111222 1073749412...

關於輸入輸出流的理解

前面學習jdk的時候,真的沒理解輸入輸出流的概念,今天上網看了別人的理解,覺得受益非淺,為了以後方便我也把我的理解記錄了下來.主要是從記憶體 磁碟 終端 螢幕 鍵盤 網路之間的闡述。程式操作的資料都應該是在記憶體裡面,記憶體是你操作的主物件,把資料從其他資源裡面傳送到記憶體裡面,就是輸入,反之,把資...

輸入輸出流

c 通過以下幾個類支援檔案的輸入和輸出 ofstream寫操作的檔案類由ostream引申而來 ifstream讀操作的檔案類由istream引申而來 fstream可同時讀寫操作的檔案類由iostream引申而來 ifstream in tian.txt 開啟乙個檔案 ifstream in in...