把資料從 資料來源 輸送到 資料目的地。
分類:
位元組 輸入流 : inputstream
位元組 輸出流 : outputstream
字元 輸入流 : ***xxreader
字元 輸出流 : ******writer
注: inputstream 和 outputstream 是抽象類
選用原則:
效率, 緩衝區位元組流 > 位元組流 > 緩衝區字元流 > 字元流
是否需要操作:基本只能是字元流(只有字元流(每次讀取的是字元) 我們才能看懂,才能操作)
位元組流:
【陣列位元組流】bytearrayinputstream/bytearrayoutputstream:
從位元組陣列中讀取資料/把資料寫到位元組陣列中。專門用來讀取位元組陣列。
bytearrayinputstream
位元組陣列輸入流:
1,具有緩衝區
2,在建立該流的時候,就會把位元組陣列中所有的內容讀取到緩衝區中。
3,加快讀取的效率
4,read();讀取到流末尾 會返回 -1
bytearrayoutputstream
有緩衝區的輸出流
1,write(資料);寫到了緩衝區中
2,flush();緩衝區中資料刷 到 目的地
緩衝區:加快執行速度,減少io操作
【檔案位元組流】fileinputstream/fileoutputstream:
從檔案中讀取資料/把資料輸出到檔案中。
fileinputstream:讀取檔案中的資料放到這個流中。
1構造器1:new fileinputstream("檔案路徑");//讀取字串路徑所表示檔案的資料
2構造器2:new fileinputstream(new file("檔案路徑"));//讀取檔案的資料
fileoutputstream: 把輸出流的資料輸出到檔案中。
1構造器1:new fileoutputstream(new file"檔案路徑");//把流中的資料輸出到檔案
2構造器2:new fileoutputstream(new file("檔案路徑"),是否追加);//讀取檔案的資料,
true-->本次輸出的資料在檔案末尾追加 ;false-->不追加,覆蓋。
【管道位元組流】位元組流:pipedinputstream/pipedoutputstream 管道輸入/輸出流。
一般結合執行緒來用。
1. 管道輸入/輸出流,這個輸入/輸出是相對於當前**來說的。
2. 管道輸入流/輸出流 通過建立物件的時候用構造器傳值建立連線。
【位元組包裝流帶緩衝區】bufferedinputstream/bufferedoutputstream 有緩衝區的包裝流
特點:有緩衝區的包裝流 效率 會高一些,可以使用mark和reset功能(標記 回讀 功能)
1:構造器 new bufferedinputstream(位元組流,緩衝區大小);//預設緩衝大小是8192位元組
2:構造器 new bufferedoutputstream(位元組流,緩衝區大小)//預設緩衝大小是512位元組
【資料型別位元組包裝流】datainputstream/dataoutputstream 讀取/寫出 某個型別的資料
5.1. 特點:可以一次寫乙個int/long/double 基本資料型別+string的資料流中,可以從流中一次讀取乙個基本資料型別的資料。
5.2.注意:是通過基本資料型別資料的 位元組數 進行讀取 ,如果a.txt中有乙個字元6, 不能用readint()去讀取,因為這個6代表的位元組數不是int所代表的位元組數。
5.3. 推薦:使用datainputstream讀取資料 最好是讀取用dataoutputstream寫出去的資料。不然讀取不到想要的效果。
【列印包裝流】列印包裝流 printstream 為另乙個輸出流新增了功能
printstream ps = new printstream(file);
提供很多格式的列印方法(多為c語言常用列印方法)
【檔案字元流】filereader/filewriter
每次讀取的都是字元,可以檢視,可以操作。
【按行讀寫字元流】
bufferedreader : 讀取一行
printwriter :寫出一行
【字元位元組轉換流】:
位元組輸入流轉換為字元輸入流:inputstreamreader
位元組輸入流轉換為字元輸入流:outputstreamwriter
特 點 : 將位元組流轉換為字元流的時候可以 設定編碼。
【隨機訪問流】:randomaccessfile
特點:將檔案中的資料全部讀取到流中,對流可以一直反覆操作。
構造器:new randomaccessfile(new file(),「r」)—>唯讀方式(「r」)
構造器:new randomaccessfile(new file(),「rw」)—>讀寫方式(「rw」)
主要操作
3.1:seek() 定位,設定到此檔案開頭測量到的檔案指標偏移量,在該位置發生下乙個讀取或寫入操作。
3.2:getfilepointer() 獲得檔案的當前偏移量
3.3:skipbytes() 跳過多少位元組數
3.4:length() 檔案大小
詳解:seek(index); 設定偏移量。
eg: a.txt檔案中 abc你 佔6位元組 seek(3),表示將偏移量設定到 abc|你 下次讀取就是讀取 你 的第乙個位元組
getfilepointer();獲得檔案中的當前偏移量
eg: a.txt檔案中 abc你 佔6位元組 讀取了3個位元組,代表當前偏移量為3 返回為3。
skipbytes(n);跳過n位元組
eg: a.txt檔案中 abc你 佔6位元組, skipbytes(1)跳過乙個位元組,偏移量在當前位置+1。
【物件流】:objectinputstream\objectoutstream
4.1:序列化:利用objectoutputstream 將物件輸出流 將物件寫到檔案中。
在利用objectoutputstream寫物件到檔案的過程中,
eg1:objectoutputstream oos = new objectoutputstream(檔案,追加);
oos.writeobject(物件1);
oos.writeobject(物件2);
oos.writeobject(物件3);
得到檔案:
標記物件1物件2物件3
eg2:
上面**執行兩次
得到檔案:
標記物件1物件2物件3標記物件1物件2物件3
4.1:反序列化:利用objectinputstream將物件從檔案中讀取到流中。
在利用objectinputstream將檔案中的物件讀取過來的時候。
eg11:讀取上eg1 所產生的檔案
objectinputstream ois = new objectinputstream(檔案);
ois.readobejct();
ois.readobject();
ois.readobject();
得到3個物件
eg22:讀取上eg2所產生的檔案
objectinputstream ois = new objectinputstream(檔案);
ois.readobejct();
ois.readobject();
ois.readobject();
ois.readobject();
ois.readobject();
ois.readobject();
得到:---> 報錯-->因為連續讀取了6個物件,但是eg2檔案中是 標記3物件標記3物件 在讀取到第四個物件的時候會報錯,readobject 讀取到的是標記。
改:objectinputstream ois = new objectinputstream(檔案);
ois.readobejct();
ois.readobject();
ois.readobject();
ois = new objectinputstream(檔案);//因為在呼叫構造器的時候回讀取 標記
ois2.readobejct();
ois2.readobject();
ois2.readobject();
得到 6物件
注意:物件的序列化和反序列化操作的物件一定要實現serializable介面。(這是空介面,只是乙個標識);
【位元組流拼接流]:sequenceinputstream/sequenceoutputstream
將多個流拼接在一起,做讀寫操做。
IO 流的分類
io的分類 1.按流的方向分 按流的方向分可以分為輸入流跟輸出流 2.按處理資料單位不同可以分為位元組流和字元流 位元組流 最原始的流,讀出來的是010101.位元組流是按照位元組乙個乙個的讀,如 fileinputstream和fileoutputstream。凡是以stream結尾的都是位元組流...
IO流的分類
流的分類 按照流的方向 1 輸入流 資料來源到程式 inputstream reader讀進來 2 輸出流 程式到目的地 outputstream writer寫進去 按照處理資料單元 1 位元組流 按照位元組讀取資料 inputstream outputstream 2 字元流 按照字元讀取資料 ...
javaSE IO流的分類 選擇
inputstream 位元組輸入流抽象基類 fileinputstream bufferedinputstream 緩衝流 高效 ouputstream 位元組輸出流抽象基類 fileoutputstream bufferedouputstream 緩衝流 高效 writer 字元文字輸出流抽象基...