日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

字节流(IO流)概述、字节流(写入/输出)数据(3种)和换行、追加写入、异常处理办法、字节缓冲流、字节流复制图片视频案例

發(fā)布時(shí)間:2023/12/29 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字节流(IO流)概述、字节流(写入/输出)数据(3种)和换行、追加写入、异常处理办法、字节缓冲流、字节流复制图片视频案例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

    • 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):

  • 按數(shù)據(jù)的流向:
    輸入流(in):讀數(shù)據(jù)(read)
    輸出流(out):寫(xiě)數(shù)據(jù)(write)
  • 按照數(shù)據(jù)類(lèi)型來(lái)分:
    字節(jié)流:字節(jié)輸入流、字節(jié)輸出流
    字符流:字符輸入流、字符輸出流
  • 一般來(lái)說(shuō):IO流是按數(shù)據(jù)類(lèi)型來(lái)分的
  • 如果數(shù)據(jù)通過(guò)Windows自帶的記事本軟件打開(kāi),我們還可以讀得懂里面的內(nèi)容,那就是字符流,否則就是字節(jié)流。如果你不知道該用哪種類(lèi)型的流,就是字節(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 OutputStream

    FileOutputStream:文件輸出流用于將數(shù)據(jù)寫(xiě)入File:
    構(gòu)造方法FileOutputStream(String name):

    創(chuàng)建文件輸出流以指定的名稱(chēng)寫(xiě)入文件 FileOutputStream fos=new FileOutputStream("myByteStream\\fos.txt"); //該類(lèi)一共做了三件事情 A:調(diào)用了系統(tǒng)功能創(chuàng)建了文件(fos.txt) //就算該抽象文件名的文件不存在也會(huì)自動(dòng)創(chuàng)建該文件 B:創(chuàng)建了字節(jié)輸出流對(duì)象 C:讓字節(jié)輸出流對(duì)象指向創(chuàng)建好的文件 //類(lèi)似指針//調(diào)用寫(xiě)入方法void write(int b);fos.write(97);//最后IO流要釋放資源 調(diào)用close方法:關(guān)閉此文件輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源fos.close();

    字節(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(OutputStream out) 字節(jié)緩沖輸入流:BufferedInputStream(InputStream in) 為什么構(gòu)造方法需要的是字節(jié)流,而不是具體的文件或者路徑呢? 字節(jié)緩沖流僅僅提供緩沖區(qū),而真正的讀寫(xiě)數(shù)據(jù)還得依靠基本的字節(jié)流對(duì)象進(jìn)行操作

    代碼示例:

    字節(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。