字节流(IO流)概述、字节流(写入/输出)数据(3种)和换行、追加写入、异常处理办法、字节缓冲流、字节流复制图片视频案例
目錄
- IO流概述和分類(lèi)
- 字節(jié)流寫(xiě)入數(shù)據(jù)(OutputStream)
- FileOutputStream
- 字節(jié)流寫(xiě)數(shù)據(jù)的3種方式
- 字節(jié)流寫(xiě)入數(shù)據(jù)的兩個(gè)小問(wèn)題
- 字節(jié)流寫(xiě)數(shù)據(jù)如何換行
- 字節(jié)流如何實(shí)現(xiàn)追加寫(xiě)入
- 字節(jié)流寫(xiě)入數(shù)據(jù)加入異常處理
- 字節(jié)流讀取數(shù)據(jù)(InputStream)
- FileInputStream
- 字節(jié)流讀取數(shù)據(jù)的三種方法
- 字節(jié)緩沖流(Buffer)
- BufferedOutputStream
- BufferedInputStream
- 字節(jié)流復(fù)制圖片視頻案例(附字節(jié)流和字節(jié)緩沖流速度比較)
- 復(fù)制圖片
- 復(fù)制視頻
IO流概述和分類(lèi)
IO流分類(lèi):
輸入流(in):讀數(shù)據(jù)(read)
輸出流(out):寫(xiě)數(shù)據(jù)(write)
字節(jié)流:字節(jié)輸入流、字節(jié)輸出流
字符流:字符輸入流、字符輸出流
字節(jié)流寫(xiě)入數(shù)據(jù)(OutputStream)
注意:
- InputStream:表示字節(jié)輸入流所有類(lèi)的超類(lèi)
- OutputStream:表示輸出流所有類(lèi)的超類(lèi)
- 子類(lèi)名特點(diǎn):子類(lèi)名稱(chēng)都是以其父類(lèi)名作為子類(lèi)名的后綴
FileOutputStream
FileOutputStream:所在包:java.io public class FileOutputStreamextends OutputStreamFileOutputStream:文件輸出流用于將數(shù)據(jù)寫(xiě)入File:
構(gòu)造方法FileOutputStream(String name):
字節(jié)流寫(xiě)數(shù)據(jù)的3種方式
| void write(int b) | 將指定的字節(jié)寫(xiě)入此文件輸出流,一次寫(xiě)一個(gè)字節(jié)數(shù)據(jù) |
| void write(byte[] by) | 將b.length字節(jié)從指定的字節(jié)數(shù)組寫(xiě)入子文件輸出流,一次寫(xiě)一個(gè)字節(jié)數(shù)組數(shù)據(jù) |
| void write(byte[] b,int off,int len) | 將len字節(jié)從指定的字節(jié)數(shù)組開(kāi)始,從偏移量off開(kāi)始寫(xiě)入此文件輸出流,一次寫(xiě)一個(gè)字節(jié)數(shù)組的部分?jǐn)?shù)據(jù)(以off為索引寫(xiě)len長(zhǎng)度的數(shù)據(jù)) |
| void flush() | 清空流并強(qiáng)制將緩沖區(qū)中所有數(shù)據(jù)寫(xiě)入流中 |
代碼示例:
輸出流的兩種構(gòu)造函數(shù) FileOutputStream(String name); FileOutputStream(File file);FileOutputStream f1 = new FileOutputStream();f1.write(97); //void write(int b)寫(xiě)入數(shù)據(jù) 字符數(shù)據(jù)在文件中顯示abyte[] b = {97,98,99,100}; f1.write(b); //void write(byte[] b)寫(xiě)入數(shù)據(jù) 字符數(shù)據(jù)在文件中顯示abcdbyte[] c = "abcdefghi".getBytes(); //利用String.getBytes()方法獲取byte數(shù)組 更直觀的定義文件中的字符數(shù)據(jù)f1.write(c); //void write(byte[] b)寫(xiě)入數(shù)據(jù) 字符數(shù)據(jù)在文件中顯示abcdefghif1.write(c,3,3); //void write(byte[] b,int off,int len)寫(xiě)入數(shù)據(jù) //從off索引開(kāi)始往后輸出len長(zhǎng)度的數(shù)據(jù) 輸出byte[3]--byte[6]的數(shù)據(jù)defgf1.close();字節(jié)流寫(xiě)入數(shù)據(jù)的兩個(gè)小問(wèn)題
字節(jié)流寫(xiě)數(shù)據(jù)如何換行
寫(xiě)完數(shù)據(jù)后,加上換行符: Windows:\r\n Linux:\n Mac:\r 例:f1.write(97); f1.write("\r\n".getBytes()); //注意換行符是String類(lèi)型,需要用getBytes()方法將String類(lèi)型轉(zhuǎn)換為byte[]類(lèi)型才能完成轉(zhuǎn)換字節(jié)流如何實(shí)現(xiàn)追加寫(xiě)入
public FileOutputStream(String name,boolean append); 創(chuàng)建文件輸出流以指定的名稱(chēng)寫(xiě)入文件。 如果第二個(gè)參數(shù)值為true,則字節(jié)將寫(xiě)入文件的末尾而不是開(kāi)頭(在沒(méi)有append參數(shù)的情況下默認(rèn)寫(xiě)入文件開(kāi)頭字節(jié)流寫(xiě)入數(shù)據(jù)加入異常處理
finally:在異常處理時(shí)提供finally塊來(lái)執(zhí)行所有清除操作。比如IO流中的釋放資源 特點(diǎn):被finally控制的語(yǔ)句一定會(huì)執(zhí)行,除非JVM退出字節(jié)流異常處理標(biāo)準(zhǔn)格式:
try{可能出現(xiàn)異常的代碼; }catch(異常類(lèi)名 變量名){變量名.異常處理代碼; }finally{執(zhí)行所有清除操作; }代碼示例:
Public static void main(String[] args){FileOutputStream f1 = null; //定義在try外面避免執(zhí)行finally語(yǔ)句時(shí)找不到f1變量 注意在外部定義時(shí)要進(jìn)行初始化(f1=null)try{f1 = new FileOutputStream("D:\\java000\\test001\\java.txt");f1.write(97);}catch(IOException e){e.printStackTrace();}finally{try{if(f1 != null)f1.close(); //執(zhí)行f1=new FileOutputStream("D:\\java000\\test001\\java.txt"); //時(shí)因該考慮初始化失敗問(wèn)題所以加入if避免空指針異常}catch(IOException e){e.printStackTrace();}} }字節(jié)流讀取數(shù)據(jù)(InputStream)
使用字節(jié)流讀數(shù)據(jù)的步驟:
1.創(chuàng)建字節(jié)輸入流對(duì)象
2.調(diào)用字節(jié)輸入流對(duì)象的讀數(shù)據(jù)方法
3.釋放資源
FileInputStream
所在包:java.io public class FileInputStreamextends InputStream 構(gòu)造函數(shù):FileInputStream(String name);代碼示例:
FileInputStream f1 = new FileInputStream("test001\\java.txt");int by=f1.read(); //調(diào)用字節(jié)輸入流對(duì)象的讀數(shù)據(jù)方法System.out.print(by); f1.close();字節(jié)流讀取數(shù)據(jù)的三種方法
| int read() | 從這個(gè)輸入流讀取一個(gè)字節(jié)的數(shù)據(jù) |
| int read(byte[] b) | 讀取b.length字節(jié)的數(shù)據(jù),從這個(gè)輸入流到一個(gè)字節(jié)數(shù)組 |
| int read(byte[] b,int off,int len) | 讀取len字節(jié)的數(shù)據(jù),從這個(gè)輸入流到一個(gè)字節(jié)數(shù)組 |
| long skip(long n) | 從輸入流跳過(guò),丟棄n字節(jié)的數(shù)據(jù)輸入流 |
代碼示例:
read(int b); 例:FileInputStream f1 = new FileInputStream("D:\\java000\\test001\\java.txt");int by;while((by = f1.read())!=-1){System.out.print((char)by);}f1.close();read(byte[] b); 例:FlieInputStream f1 = new FlieInputStream("D:\\java000\\test001\\java.txt");byte[] by = new byte[1024] //一般長(zhǎng)度設(shè)置為1024的倍數(shù)int len; while(( len = f1.read(by) ) != -1){ //注意:len=f1.read(by);中l(wèi)en表示f1文件中讀到的字符數(shù)量 //當(dāng)byte[n]中n小于len時(shí) read()讀出的是n長(zhǎng)度的字符System.out.print( new String(by) ); //len表示read方法所讀到的字符數(shù)量}f1.close();read(byte[] b,int off,intlen); 例:FileInputStream f1 = new FileInputStream("D:\\java000\\test001\\java.txt");byte[] b = new byte[1024];int len;while( ( len=f1.read(by) )!=-1 ){System.out.print( new String(by,0,len) ); //new String(byte[] bytes,int offset,int length): 通過(guò)使用平臺(tái)默認(rèn)字符集解碼指定的字節(jié)子陣列來(lái)構(gòu)造新的String. 就是轉(zhuǎn)換byte[0]~byte[len]成為新的String }字節(jié)緩沖流(Buffer)
BufferedOutputStream
所在包:java.io public class BufferedOutputStreamextends FilterOutputStream該類(lèi)實(shí)現(xiàn)緩沖輸出流。通過(guò)設(shè)置這樣的輸出流,應(yīng)用程序可以向底層輸出流寫(xiě)入字節(jié),而不必為寫(xiě)入的每個(gè)字節(jié)導(dǎo)致底層系統(tǒng)的調(diào)用
BufferedInputStream
所在包:java.io public class BufferedInputStreamextends FilterInputStream創(chuàng)建BufferedInputStream將創(chuàng)建一個(gè)內(nèi)部緩沖區(qū)數(shù)組。當(dāng)從流中讀取或跳過(guò)字節(jié)時(shí),內(nèi)部緩沖區(qū)將根據(jù)需要從所包含的輸入流中重新填充,一次很多字節(jié)。
構(gòu)造方法:
代碼示例:
字節(jié)緩沖輸出流: BufferedOutputStream bf1 = new BufferedOutputStream( new FileOutputStream("test001\\java.txt") ); bf1.write("abcdefg\r\n".getBytes); //String轉(zhuǎn)換為byte類(lèi)型用String.Bytes();方法 bf1.close();字節(jié)緩沖輸入流: BufferedInputStream bf2 = new BufferedInputStream( new FileInputStream("test001\\java.txt") ); byte[] by = new byte[1024]; int len; while( (len=bf2.read(by))!=-1 ){System.out.print( new String(by,0,len) ); } bf2.close();字節(jié)流復(fù)制圖片視頻案例(附字節(jié)流和字節(jié)緩沖流速度比較)
復(fù)制圖片
代碼示例:
使用字節(jié)數(shù)組讀寫(xiě)復(fù)制即可:FileInputStream in = new FileInputStream("數(shù)據(jù)源文件");FileOutputStream out = new FileOutputStream("目的地文件");byte[] by=new byte[1024];int len;while( (len=in.read(by))!=-1 ){out.write(by,0,len);}in.close();out.close(); 注意:字節(jié)流復(fù)制可以復(fù)制任意文件流程:1.創(chuàng)建輸入流(InputStream)2.創(chuàng)建輸出流(OutputStream)3.循環(huán)復(fù)制 4.close釋放資源復(fù)制視頻
利用四種方法來(lái)復(fù)制視頻,并比較四種方法之間哪種方法最快1.基本字節(jié)流一次讀寫(xiě)一個(gè)字節(jié) //最慢2.基本字節(jié)流一次讀寫(xiě)一個(gè)字節(jié)數(shù)組 //比第1種快60+倍3.字節(jié)緩沖流一次讀寫(xiě)一個(gè)字節(jié) //比第3種慢一點(diǎn)點(diǎn)4.字節(jié)緩沖流一次讀寫(xiě)一個(gè)字節(jié)數(shù)組 //最快 時(shí)間記錄由System.currentTimeMillis();方法記錄 int start = System.currentTimeMillis(); int end = System.currentTimeMillis();代碼示例:
1.基本字節(jié)流一次讀寫(xiě)一個(gè)字節(jié): FileOutputStream fout1=new FileOutputStream("復(fù)制目的地");FileInputStream fin1=new FileInputStream("視頻源");int by;while( (by=fin1.read() ) != -1){fout1.write(by);}fout1.close();fin.close();2.基本字節(jié)流一次讀寫(xiě)一個(gè)字節(jié)數(shù)組:FileOutputStream fout1=new FileOutputStream("復(fù)制目的地");FileInputStream fin1=new FileInputStream("視頻源");int len;byte[] by = new byte[1024];while( (len=fin1.read(by))!=-1 ){fout1.write(by,0,len); //將len字節(jié)從指定的字節(jié)數(shù)組開(kāi)始,從偏移量off開(kāi)始寫(xiě)入此文件輸出流, //一次寫(xiě)一個(gè)字節(jié)數(shù)組的部分?jǐn)?shù)據(jù)(以off為索引寫(xiě)len長(zhǎng)度的數(shù)據(jù))}fout1.close();fin.close();3.字節(jié)緩沖流一次讀寫(xiě)一個(gè)字節(jié):BufferedOutputStream bout1=new BufferedOutputStream("存入目標(biāo)");BufferedInputStream bin1=new BufferedInputStream("目標(biāo)源文件");int by;while( (by=bin1.read())!=-1 ){bout1.write(by);}bout1.close();bin1.close();4.字節(jié)緩沖流一次讀寫(xiě)一個(gè)字節(jié)數(shù)組:BufferedOutputStream bout1=new BufferedOutputStream("存入目標(biāo)");BufferedInputStream bin1=new BufferedInputStream("目標(biāo)源文件");int len;byte[] by=new byte[1024];while( (len=bin1.read())!=-1 ){bout1.write(by,0,len);}bout1.close();bin1.close();總結(jié)
以上是生活随笔為你收集整理的字节流(IO流)概述、字节流(写入/输出)数据(3种)和换行、追加写入、异常处理办法、字节缓冲流、字节流复制图片视频案例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: KEBA控制器通过NT50连接西门子S7
- 下一篇: 手机怎样将PDF转为Word可编辑格式,