IO流概述及其分類
-
IO流概述
IO流用來處理裝置之間的資料傳輸
Java對資料的操作是通過流的方式
Java用于操作流的對象都在IO包中
-
IO流分類
a:按照資料流向
輸入流 讀入資料
輸出流 寫出資料
b:按照資料類型
位元組流 可以讀寫任何類型的檔案 比如音頻 視訊 文本檔案
字元流 隻能讀寫文本檔案
什麼情況下使用哪種流呢?
如果資料所在的檔案通過windows自帶的記事本打開并能讀懂裡面的内容,就用字元流。其他用位元組流。
IO流基類概述和FileOutputStream的構造方法
-
IO流基類概述
a:位元組流的抽象基類:
InputStream ,OutputStream。
b:字元流的抽象基類:
Reader , Writer。
注:由這四個類派生出來的子類名稱都是以其父類名作為子類名的字尾。
如:InputStream的子類FileInputStream。
如:Reader的子類FileReader。
-
FileOutputStream的構造方法
由一個案例引出使用IO流寫資料,由于位元組流先出現就寫位元組輸出流基類OutputStream,
使用具體子類FileOutputStream
IO流的分類
- Io流的分類:
-
(1): 按照流向進行劃分
輸入流
輸出流
- (2): 按照操作的資料類型進行劃分
- 位元組流
- 位元組輸入流 InputStream 讀
- 位元組輸出流 OutputStream 寫
- 字元流
- 字元輸入流 Reader 讀
- 字元輸出流 Writer 寫
- 需求: 往一個文本檔案中寫一串資料 Hello,IO
- 分析:
- a: 我們現在操作的是文本檔案,所有按照我們的想法,我們優先現在字元流,但是位元組流是優先于字元流. 是以先使用位元組流
- b: 因為我們要寫資料,是以我們應該使用位元組流中輸出流 OutputStream
- 我們發現OutputStream是一個抽象類,我們不能對其進行直接執行個體化,而我們需要使用子類對其進行執行個體化.那麼選擇哪個子類呢?
- 我們現在操作的是檔案是以我們選擇的是FileOutputStream
-
FileOutputStream寫出資料
-
構造方法
FileOutputStream(File file)
FileOutputStream(String name)
-
注意事項:
建立位元組輸出流對象了做了幾件事情?
a:調用系統資源建立a.txt檔案
b:建立了一個fos對象
c:把fos對象指向這個檔案
-
為什麼一定要close()?
a: 通知系統釋放關于管理a.txt檔案的資源
b: 讓Io流對象變成垃圾,等待垃圾回收器對其回收
FileOutputStream的三個write()方法
-
FileOutputStream的三個write()方法
public void write(int b):寫一個位元組 超過一個位元組 砍掉前面的位元組
public void write(byte[] b):寫一個位元組數組
public void write(byte[] b,int off,int len):寫一個位元組數組的一部分
FileOutputStream寫出資料實作換行和追加寫入
public class MyTest4 {
public static void main(String[] args) throws IOException {
//windows下的換行符隻用是 \r\n
//Linux \n
//Mac \r
FileOutputStream out = new FileOutputStream("b.txt");
out.write("池塘邊的榕樹上知了在聲聲的叫着夏天".getBytes());
out.write("\r\n".getBytes());//寫入一個換行符
out.write("黑闆上老師的粉筆還在叽叽喳喳寫個不停".getBytes());
out.write("\r\n".getBytes());//寫入一個換行符
out.write("等待着下課,等待着放學,等待遊戲的童年".getBytes());
out.write("\r\n".getBytes());//寫入一個換行符
//釋放資源
out.close();
}
}
public class MyTest5 {
public static void main(String[] args) throws IOException {
//FileOutputStream(File file, boolean append)
//建立一個向指定 File 對象表示的檔案中寫入資料的檔案輸出流。
//
//FileOutputStream(String name, boolean append)
//建立一個向具有指定 name 的檔案中寫入資料的輸出檔案流。
//參數2:代表是否追加寫入,true 追加寫入 false 不追加
FileOutputStream out = new FileOutputStream("c.txt",true);
out.write("池塘邊的榕樹上知了在聲聲的叫着夏天".getBytes());
out.write("\r\n".getBytes());//寫入一個換行符
out.write("黑闆上老師的粉筆還在叽叽喳喳寫個不停".getBytes());
out.write("\r\n".getBytes());//寫入一個換行符
out.write("等待着下課,等待着放學,等待遊戲的童年".getBytes());
out.write("\r\n".getBytes());//寫入一個換行符
//釋放資源
out.close();
}
}
FileOutputStream寫出資料加入異常處理
public class MyTest {
public static void main(String[] args) {
//流的異常處理
FileOutputStream out = null;
try {
out = new FileOutputStream("d.txt");
out.write(100);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
位元組流複制文本檔案
public class CopyFile {
public static void main(String[] args) throws IOException {
//使用檔案輸入輸出流進行檔案的複制
//ctrl+alt+空格 手動提示鍵
//關聯源檔案
FileInputStream in = new FileInputStream("MyTest2.java");
//關聯目标檔案
FileOutputStream out = new FileOutputStream("E:\\MyTest2.java");
//複制邏輯:讀取一個位元組,寫入一個位元組
//循環的讀寫
int len=0;
while ((len=in.read())!=-1){
out.write(len);
out.flush();//重新整理
}
//釋放資源
in.close();
out.close();
}
}
位元組流複制MP3
public class CopyFile2 {
public static void main(String[] args) throws IOException {
//我們讀取一個位元組,寫入一個位元組,來複制音頻檔案
FileInputStream in = new FileInputStream("領悟1.mp3");
FileOutputStream out = new FileOutputStream("E:\\領悟-辛曉琪-詞李宗盛.mp3");
int len=0;//定義一個變量,記錄讀取到的位元組
//循環讀寫
while ((len=in.read())!=-1){
out.write(len);
out.flush();
}
//釋放資源
in.close();
out.close();
}
}
BufferedOutputStream寫出資料
-
緩沖思想
位元組流一次讀寫一個數組的速度明顯比一次讀寫一個位元組的速度快很多,
這是加入了數組這樣的緩沖區效果,java本身在設計的時候,
也考慮到了這樣的設計思想(裝飾設計模式後面講解),是以提供了位元組緩沖區流
-
ufferedOutputStream的構造方法
檢視API
BufferedOutputStream(OutputStream out)
BufferedInputStream讀取資料
BufferedInputStream的構造方法
檢視API
BufferedInputStream(InputStream in)