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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1、字节流详解

發布時間:2023/12/29 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1、字节流详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、字節流
    • 1、字節輸出流:OutputStream
    • 2、字節輸入流:InputStream
    • 3、使用字節流復制數據
    • 4、字節緩沖流

一、字節流


文件字節流
字節流的兩個抽象父類:字節輸出流:OutputStream字節輸入流:InputStream


1、字節輸出流:OutputStream

這個抽象類是表示字節輸出流的所有類的超類。 輸出流接收輸出字節并將其發送到某個接收器。
  • 查看API可以知道,字節流寫數據一共有三種方式:
    • public void write(int b) :寫入一個字節
    • public void write(byte[] b):寫入一個字節數組
    • public void write(byte[] b,int off,int len):寫入一個字節數組的一部分
    • close():關閉此文件輸入流,并釋放與流相關的所有系統資源

  • 使用字節輸出流寫入數據:使用 OutputStream 它的子類 FileOutputStream
    • FileOutputStream 類的構造方法:
      • FileOutputStream(File file)
      • FileOutputStream(String name)


  • 字節輸出流寫入數據的操作步驟:
    • 第一步:創建字節輸出流對象 ,并指定文件路徑,不指定文件路徑默認在項目路徑。如果該路徑沒有該文件,創建字節輸入流對象會將該文件創建出來
    • 第二步:用輸出流對象點 write() 方法,根據傳入的參數確認調用的那個寫入的方法,并將參數內容寫入流對象指定的文件中
    • 第三步:關閉流對象

  • Demo代碼示例

    public class FileOutputStreamDemo {public static void main(String[] args) throws IOException {// 創建字節輸出流對象(FileOutputStream的這兩種構造方法效果是一樣的用那個都可以)// FileOutputStream(File file)// File file = new File("fos.txt");// FileOutputStream fos = new FileOutputStream(file);//構造方法: FileOutputStream(String name)FileOutputStream fos = new FileOutputStream("fos.txt");try {// 調用write()方法,向fos文件中寫入數據,寫入一個字節fos.write(97); //輸出結果是97 -- 底層二進制數據 -- 通過記事本打開 -- 找97對應的字符值 -- a//換行fos.write("\r\n".getBytes());//public void write(byte[] b):寫一個字節數組byte[] bys={97,98,99,100,101};fos.write(bys);//輸出結果是abcde//換行fos.write("\r\n".getBytes());//public void write(byte[] b,int off,int len):寫一個字節數組的一部分,存儲數據下標范圍fos.write(bys,1,3);//輸出結果是bcd//換行fos.write("\r\n".getBytes());//調用write()方法,向fos文件中寫入數據,寫入一段字符串并轉換成 Byte 數組fos.write("HelloWorld\t".getBytes());fos.write("JAVA\t".getBytes());} catch (IOException e) {e.printStackTrace();} finally {//釋放資源,這一步很重要,如果不關閉流,流對象就會始終存在,占用的內容空間!!!//關閉此文件輸出流并釋放與此流有關的所有系統資源。fos.close();}} }

運行結果:

運行程序,完成之后刷新項目,就可以看到創建的fos.txt的文件,并且里面的內容是寫入數據的內容 :

最后,為什么使用完流之后一定要使用 close() 方法將流關閉呢?
如果不關閉流,流對象就會始終存在,占用的內容空間!所以使用該方法讓流對象變成垃圾,這樣就可以被垃圾回收器回收了。

??? ???字節輸出流操作步驟:
??? ?????? ???A:創建字節輸出流對象
??? ?????? ???B:寫數據
??? ?????? ???C:釋放資源


??? ???我們在寫代碼時候,一定要先將問題總結出來,不然容易將自己搞得很混亂,代碼質量也不高。所以要一步一步的將功能的整體實現步驟總結出來,這樣會讓你的思路更清晰,代碼寫的更流暢!

2、字節輸入流:InputStream

這個抽象類是表示字節輸入流的所有類的超類。
  • 使用字節輸入流讀取數據:使用 InputStream的子類FileInputStream

    • FileInputStream 類的構造方法
      • FileInputStream(File file)
      • FileInputStream(String name)
    • FileInputStream的成員方法
      • public int read():一次讀取一個字節
      • public int read(byte[] b):一次讀取一個字節數組
  • 字節輸入流讀取數據的操作步驟:

    • 第一步:創建字節輸入流對象 ,并指定文件路徑,不指定文件路徑默認在項目路徑。如果該路徑沒有該文件,便會報出找不到文件的錯誤
    • 第二步:調用read()方法讀取數據,并把數據顯示在控制臺
    • 第三步:關閉流對象

  • Demo代碼示例
//讀取數據//字節讀取流 public class Demo02_IO_FileInputStream {public static void main(String[] args) throws IOException {//創建字節輸入流對象,并且在 () 中填寫文件名稱,在創建對象時會在指定項目中已經存在的文件,準備讀取文件中內容FileInputStream fileInputStream = new FileInputStream("fos.txt");/*數據量小時候使用單個字節讀取即可,假如我們要讀取字節數比較大的文件的時候,我們就不能一次讀取一個字節了,就要一次讀取一個字節數組。并且因為中文在utf-8編碼中文占三個字節,GBK占兩個字節,所以單個字符讀取會亂碼 *//* int in = 0;// 讀取,賦值,判斷while ((in = fileInputStream.read()) != -1){System.out.print((char) in);}*/try {//數據量大時,推薦使用下面這個方法,讀取快且不會亂碼// 數組的長度一般是1024或者1024的整數倍//注:此處數組長度設置為1024的原因,是因為 read(byte[] b)方法一次讀取的是一整個字節數組,也就是一次讀取1024個字節byte[] bys = new byte[1024];int len = 0;while ((len = fileInputStream.read(bys)) != -1) {System.out.print(new String(bys, 0, len));}} catch (IOException e) {e.printStackTrace();} finally {// 釋放資源fileInputStream.close();}} }

運行結果:




3、使用字節流復制數據


學習了文件操作類 File 類,以及上面的字節流讀取和寫入數據,接下來學習如何使用 File 類和字節流讀取和寫入數據實現數據的復制功能。

??? ?????? ??? 在實現復制功能時候,需要注意兩點:
??? ?????? ??? 1、數據源:從哪里來
??? ?????? ?????? ?????? ???從 fos.txt 中讀取數據,然后將讀取到的數據存儲到 FileInputStream 對象中。
??? ?????? ??? 2、目的地:到哪里去
??? ?????? ?????? ?????? ???通過 FileOutputStream 對象找到數據封裝地,然后將從數據源讀取出來的數據寫入數據封裝地。

Demo代碼示例:

public class IO_CopyFile {public static void main(String[] args) throws IOException{IO_CopyFile cf = new IO_CopyFile ();cf .copyFile();}//公共變量FileInputStream copy = null;FileOutputStream paste = null;// 文件復制方法public void copyFile() throws IOException{try {//指定封裝數據源,該數據源需要是真實存在的,從該數據源中獲取數據copy = new FileInputStream("fos.txt");//指定封裝目的地,將從數據源獲取到的數據存儲在此文件中paste = new FileOutputStream("copy.txt");//使用這個方法可以將文件復制過去,但是效率會很慢,一個字節一個字節復制/* int by = 0;while ((by = copy.read()) != -1) {paste.write(by);}*///在實際開發中要是寫復制文件的功能的話通常使用下面這個方法,一個復制1024個字節,會大大提升復制的效率// 數組的長度一般是1024或者1024的整數倍byte[] bys = new byte[1024];int len = 0;//copy對象調用read(),將copy對象所指定的文件中的字節數據內容讀取出來,并存儲在len變量中while ((len = copy.read(bys)) != -1) {//paste對象調用write方法,將len變量中的內容寫入paste對象所指定的文件中paste.write(bys, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {// 釋放字節輸出流和輸入流資源copy.close();paste.close();}} }

運行結果:
項目路徑下會出現新創建的封裝地文件–copy.txt

并且也成功的將文件內的數據復制到了封裝地文件中。





4、字節緩沖流

在實現字節流復制數據的時候,可以發現字節一個一個讀取和寫入數據的效率要比一次讀取和寫入一個數組的效率要低。這是因為數組有著緩沖區的效果,所以使用數組讀寫數據會有效的提高效率。
??? ???java 本身在設計的時候,也考慮到了這樣的設計思想(裝飾設計模式),所以提供了字節緩沖區流。
??? ???這種類被稱為:緩沖區類(高效類),其實和字節輸入流和輸出流的使用方法差不多,就是在原本的基礎上提供了一個緩沖區。有效的提高我們在使用 IO 流時數據的流通效率。
  • 緩沖區類(高效類)
    • 字節緩沖輸出流

      • BufferedOutputStream
        • 使用字節緩沖輸入流寫入數據
          • Demo代碼示例:public class BufferedOutputStreamDemo {public static void main(String[] args) throws IOException {// BufferedOutputStream(OutputStream out)// 創建字節緩沖輸出流對象,將字節輸出流對象放入緩沖區中BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));// 寫數據bos.write("hello".getBytes());// 釋放資源bos.close();} } 運行結果:
    • 字節緩沖輸入流

      • BufferedInputStream
    • 使用字節緩沖輸入流讀取數據

      • Demo代碼示例: public class BufferedInputStreamDemo {public static void main(String[] args) throws IOException {// BufferedInputStream(InputStream in)// 創建字節緩沖輸入流對象,將字節輸入流對象放入緩沖區中BufferedInputStream bis = new BufferedInputStream(new FileInputStream( "bos.txt"));// 讀取數據byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) != -1) {// 將讀取出來的數據打印在控制臺System.out.print(new String(bys, 0, len));}// 釋放資源bis.close();}} 運行結果:

  • 使用字節緩沖流復制數據
    • Demo代碼示例:
    public class BufferedCopy {public static void main(String[] args) {BufferedCopy bc = new BufferedCopy();bc.bfCopy();}public void bfCopy(){BufferedInputStream bis = null;BufferedOutputStream bos = null;try {//數據源bis = new BufferedInputStream(new FileInputStream( "bs.txt"));//封裝地bos = new BufferedOutputStream(new FileOutputStream("copyBs.txt"));byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {try {bis.close();} catch (IOException e) {e.printStackTrace();}try {bos.close();} catch (IOException e) {e.printStackTrace();}}}}

運行結果:

總結

以上是生活随笔為你收集整理的1、字节流详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。