目錄:IO流
IO流概述及其分類A:IO流概述
IO流用來處理設(shè)備之間的數(shù)據(jù)傳輸
Java對(duì)數(shù)據(jù)的操作是通過流的方式
Java用于操作流的對(duì)象都在IO包中 java.io
B:IO流分類
a:按照數(shù)據(jù)流向 站在內(nèi)存角度
輸入流 讀入數(shù)據(jù)
輸出流 寫出數(shù)據(jù)
b:按照數(shù)據(jù)類型
字節(jié)流 可以讀寫任何類型的文件 比如音頻 視頻 文本文件
字符流 只能讀寫文本文件
什么情況下使用哪種流呢?
如果數(shù)據(jù)所在的文件通過windows自帶的記事本打開并能讀懂里面的內(nèi)容,就用字符流。其他用字節(jié)流。
如果你什么都不知道,就用字節(jié)流
IO流基類概述和FileOutputStream的構(gòu)造方法A:IO流基類概述
a:字節(jié)流的抽象基類:
InputStream ,OutputStream。
b:字符流的抽象基類:
Reader , Writer。
注:由這四個(gè)類派生出來的子類名稱都是以其父類名作為子類名的后綴。
如:InputStream的子類FileInputStream。
如:Reader的子類FileReader。
B:FileOutputStream的構(gòu)造方法
由一個(gè)案例引出使用IO流寫數(shù)據(jù),由于字節(jié)流先出現(xiàn)就先學(xué)習(xí)字節(jié)輸出流基類OutputStream,
使用具體子類FileOutputStream
Io流的分類:
- (1): 按照流向進(jìn)行劃分
輸入流
輸出流
- (2): 按照操作的數(shù)據(jù)類型進(jìn)行劃分
- 字節(jié)流
- 字節(jié)輸入流 InputStream 讀
- 字節(jié)輸出流 OutputStream 寫
- 字符流
- 字符輸入流 Reader 讀
- 字符輸出流 Writer 寫
-
- 需求: 往一個(gè)文本文件中寫一串?dāng)?shù)據(jù) Hello,IO
- 分析:
- a: 我們現(xiàn)在操作的是文本文件,所有按照我們的想法,我們優(yōu)先現(xiàn)在字符流,但是字節(jié)流是優(yōu)先于字符流. 所以先使用字節(jié)流
- b: 因?yàn)槲覀円獙憯?shù)據(jù),所以我們應(yīng)該使用字節(jié)流中輸出流 OutputStream
- 我們發(fā)現(xiàn)OutputStream是一個(gè)抽象類,我們不能對(duì)其進(jìn)行直接實(shí)例化,而我們需要使用子類對(duì)其進(jìn)行實(shí)例化.那么選擇哪個(gè)子類呢?
- 我們現(xiàn)在操作的是文件所以我們選擇的是FileOutputStream
FileOutputStream寫出數(shù)據(jù)A: 構(gòu)造方法
FileOutputStream(File file)
FileOutputStream(String name)
B:案例演示
FileOutputStream寫出數(shù)據(jù)
public static void main(String[] args) throws IOException {
//異常的處理 File
//I/O InputStream 輸入流 OutPutStream 輸出流 處理設(shè)備之間的一個(gè)數(shù)據(jù)傳輸
//流按照流向分:分為 輸入流和輸出流
//按照讀寫文件的類型分:分為字節(jié)流(可以讀寫任意類型的文件)和字符流(讀寫文本文件)
//字節(jié)流:
//文件輸入輸出 流
//文件輸出流:寫出數(shù)據(jù)
//
//FileOutputStream(File file)
//創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫入數(shù)據(jù)的文件輸出流。
//FileOutputStream(String name)
//創(chuàng)建一個(gè)向具有指定名稱的文件中寫入數(shù)據(jù)的輸出文件流。
File file = new File("a.txt");
//file.createNewFile();
//輸入流,所關(guān)聯(lián)的文件,如果該文件不存在 ,那么會(huì)自動(dòng)幫你創(chuàng)建
FileOutputStream out = new FileOutputStream(file);
FileOutputStream fileOutputStream = new FileOutputStream("b.txt");
//流用完之后必須釋放資源
out.close();
fileOutputStream.close();
}
注意事項(xiàng):
創(chuàng)建字節(jié)輸出流對(duì)象了做了幾件事情?
a:調(diào)用系統(tǒng)資源創(chuàng)建a.txt文件
b:創(chuàng)建了一個(gè)fos對(duì)象
c:把fos對(duì)象指向這個(gè)文件
為什么一定要close()?
a: 通知系統(tǒng)釋放關(guān)于管理a.txt文件的資源
b: 讓Io流對(duì)象變成垃圾,等待垃圾回收器對(duì)其回收
FileOutputStream的三個(gè)write()方法A:FileOutputStream的三個(gè)write()方法
public void write(int b):寫一個(gè)字節(jié) 超過一個(gè)字節(jié) 砍掉前面的字節(jié)
public void write(byte[] b):寫一個(gè)字節(jié)數(shù)組
public void write(byte[] b,int off,int len):寫一個(gè)字節(jié)數(shù)組的一部分
B:案例演示: FileOutputStream的三個(gè)write()方法
public static void main(String[] args) throws IOException {
//通過文件輸出流,往他所關(guān)聯(lián)的件中,寫出數(shù)據(jù)
FileOutputStream out = new FileOutputStream("a.txt");
//寫數(shù)據(jù)
out.write(97); //一次寫入一個(gè)字節(jié)
out.write(98);
out.write(99);
out.write(100);
out.write(300); //超過了一個(gè)字節(jié),會(huì)丟棄掉多余字節(jié)
byte[] bytes = {101, 102, 103, 104};
out.write(bytes);//一次寫入一個(gè)字節(jié)數(shù)組
out.write(bytes, 2, 2);//一次寫入字節(jié)數(shù)組的一部分,從2索引開始,寫2個(gè)字節(jié)
String str = "楊家有女初長成,養(yǎng)在深閨人未識(shí)";
//UTF-8 編碼 一個(gè)漢字占三個(gè)字節(jié)
byte[] bytes1 = str.getBytes();//將一個(gè)字符串,轉(zhuǎn)換成字節(jié)數(shù)組
out.write(bytes1);
out.close();
}
FileOutputStream寫出數(shù)據(jù)實(shí)現(xiàn)換行和追加寫入A:案例演示: FileOutputStream寫出數(shù)據(jù)如何實(shí)現(xiàn)數(shù)據(jù)的換行
windows下的換行符只用是 \r\n
Linux \n
Mac \r
eclipse/IDEA 中的記事本軟件以及editplus這樣的第三種軟件都做了平臺(tái)的兼容
public static void main(String[] args) throws IOException { FileOutputStream out = new FileOutputStream(“b.txt”); out.write(“回眸一笑百媚生,六宮粉黛無顏色”.getBytes()); out.write("\r\n".getBytes());//寫入一個(gè)回車換行符 out.write(“回眸一笑百媚生,六宮粉黛無顏色”.getBytes()); out.write("\r\n".getBytes());//寫入一個(gè)回車換行符 out.write(“回眸一笑百媚生,六宮粉黛無顏色”.getBytes()); out.write("\r\n".getBytes());//寫入一個(gè)回車換行符 out.write(“回眸一笑百媚生,六宮粉黛無顏色”.getBytes()); //各個(gè)平臺(tái)的換行符,都不一樣
//windows 平臺(tái) \r\n
//Linux \n
//Mac \r
//流用完之后,必須釋放資源
out.close(); //關(guān)閉流
}
B:案例演示: FileOutputStream寫出數(shù)據(jù)如何實(shí)現(xiàn)數(shù)據(jù)的追加寫入
public static void main(String[] args) throws IOException {
//注意事項(xiàng):
//創(chuàng)建字節(jié)輸出流對(duì)象了做了幾件事情 ?
// a : 調(diào)用系統(tǒng)資源創(chuàng)建a.txt文件
//b:
//創(chuàng)建了一個(gè)fos對(duì)象
//c:
//把fos對(duì)象指向這個(gè)文件
//為什么一定要close() ?
//
// a : 通知系統(tǒng)釋放關(guān)于管理a.txt文件的資源
//b:
//讓Io流對(duì)象變成垃圾, 等待垃圾回收器對(duì)其回收
//FileOutputStream(File file, boolean append)
//創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫入數(shù)據(jù)的文件輸出流。
//
//
//FileOutputStream(String name, boolean append)
//創(chuàng)建一個(gè)向具有指定 name 的文件中寫入數(shù)據(jù)的輸出文件流。
//參數(shù)2:true 代表追加寫入,false 不追加
FileOutputStream out = new FileOutputStream("c.txt",true);
out.write("回眸一笑百媚生,六宮粉黛無顏色".getBytes());
out.write("\r\n".getBytes());//寫入一個(gè)回車換行符
out.write("回眸一笑百媚生,六宮粉黛無顏色".getBytes());
//釋放資源
out.close();
}
FileOutputStream寫出數(shù)據(jù)加入異常處理A:案例演示:FileOutputStream寫出數(shù)據(jù)加入異常處理
public static void main(String[] args) throws IOException {
//
//FileInputStream(String name)
//通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè) FileInputStream,該文件通過文件系統(tǒng)中的路徑名 name 指定。
//
//FileInputStream(File file)
//通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè) FileInputStream,該文件通過文件系統(tǒng)中的 File 對(duì)象 file 指定。
//文件輸入流
File file = new File("e.txt");
//輸入流所關(guān)聯(lián)的文件,如果不存在,就會(huì)報(bào)錯(cuò)
FileInputStream in = new FileInputStream(file);
FileInputStream in2 = new FileInputStream("e.txt");
}
FileInputStream讀取數(shù)據(jù)一次一個(gè)字節(jié)A:案例演示: int read():一次讀取一個(gè)字節(jié)
如果沒有數(shù)據(jù)返回的就是-1
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("e.txt");
//讀取文件中的數(shù)據(jù)
int len = in.read();//一次讀取一個(gè)字節(jié)
System.out.println(len);
len = in.read();//一次讀取一個(gè)字節(jié)
System.out.println(len);
len = in.read();//一次讀取一個(gè)字節(jié)
System.out.println(len);
len = in.read();//一次讀取一個(gè)字節(jié)
System.out.println(len);
len = in.read();//一次讀取一個(gè)字節(jié)
System.out.println(len);
len = in.read();//一次讀取一個(gè)字節(jié)
System.out.println(len);
len = in.read();//一次讀取一個(gè)字節(jié)
System.out.println(len); //讀取不到返回-1
in.close();//記得流用完之后,釋放資源
}
字節(jié)流復(fù)制文本文件A:案例演示: 字節(jié)流一次讀寫一個(gè)字節(jié)復(fù)制文本文件
分析:
- a: 創(chuàng)建字節(jié)輸入流對(duì)象和字節(jié)輸出流對(duì)象
- b: 頻繁的讀寫操作
- c: 釋放資源
public static void main(String[] args) throws IOException {
//我們可以使用文件輸入輸出流,進(jìn)行文件的復(fù)制
//方式:讀取一個(gè)字節(jié),寫入一個(gè)字節(jié)來復(fù)制
FileInputStream in = new FileInputStream("MyTest.java");
FileOutputStream out = new FileOutputStream("E:\\MyTest.java");
//循環(huán)的讀寫
//定義一個(gè)變量
int len=0; //表示讀取到的字節(jié)
while ((len=in.read())!=-1){
out.write(len);
out.flush();//刷新
}
//釋放資源
in.close();
out.close();
}
字節(jié)流復(fù)制MP3A:案例演示: 字節(jié)流一次讀寫一個(gè)字節(jié)復(fù)制MP3
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("demo.mp3");
FileOutputStream out = new FileOutputStream("E:\\曾經(jīng)的你.mp3");
int len=0;
long start = System.currentTimeMillis();
while ((len=in.read())!=-1){
out.write(len);
out.flush();
}
long end = System.currentTimeMillis();
System.out.println((end-start) "毫秒");
in.close();
out.close();
}
FileInputStream讀取數(shù)據(jù)一次一個(gè)字節(jié)數(shù)組A:案例演示: int read(byte[] b):一次讀取一個(gè)字節(jié)數(shù)組
返回的int類型的值表示的意思是讀取到的字節(jié)的個(gè)數(shù),如果沒有數(shù)據(jù)了就返回-1
public static void main(String[] args) throws IOException {
//很顯然,一次讀寫一個(gè)字節(jié)的方式 ,復(fù)制文件,效率太低
//我們可以一次讀寫一個(gè)字節(jié)數(shù)組的方式來復(fù)制文件
FileInputStream in = new FileInputStream("demo.mp3");
FileOutputStream out = new FileOutputStream("E:\\曾經(jīng)的你2.mp3");
//定義一個(gè)字節(jié)數(shù)組,充當(dāng)緩沖區(qū)
byte[] bytes = new byte[1024 * 8];
int len = 0;//記錄每次讀取到的有效字節(jié)個(gè)數(shù)
long start = System.currentTimeMillis();
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
out.flush();
}
long end = System.currentTimeMillis();
System.out.println((end - start) "毫秒");
in.close();
out.close();
}
FileInputStream讀取數(shù)據(jù)的兩種方式比較圖解A:畫圖演示: FileInputStream讀取數(shù)據(jù)的兩種方式比較圖解
BufferedOutputStream寫出數(shù)據(jù)A:緩沖思想
字節(jié)流一次讀寫一個(gè)數(shù)組的速度明顯比一次讀寫一個(gè)字節(jié)的速度快很多,
這是加入了數(shù)組這樣的緩沖區(qū)效果,java本身在設(shè)計(jì)的時(shí)候,
也考慮到了這樣的設(shè)計(jì)思想(裝飾設(shè)計(jì)模式后面講解),所以提供了字節(jié)緩沖區(qū)流
B:BufferedOutputStream的構(gòu)造方法
查看API
BufferedOutputStream(OutputStream out)
C:案例演示
BufferedOutputStream寫出數(shù)據(jù)
20.21_IO流(BufferedInputStream讀取數(shù)據(jù))(掌握)A:BufferedInputStream的構(gòu)造方法
查看API
BufferedInputStream(InputStream in)
B:案例演示
BufferedInputStream讀取數(shù)據(jù)
BufferedInputStream bfr = new BufferedInputStream(new FileInputStream("demo.mp3"));
BufferedOutputStream bfw = new BufferedOutputStream(new FileOutputStream("demo2.mp3"));
//讀取一個(gè)字節(jié)寫入一個(gè)字節(jié)
int len=0;
byte[] bytes = new byte[1024 * 8];
while ((len=bfr.read(bytes))!=-1){
bfw.write(bytes,0,len);
}
bfr.close();
bfw.close(); 來源:https://www./content-4-354451.html
|