Jakartase_IO流_ — 字節流和字符流的區別(壹)

1、流的概念

  • 1.一、程序中全部的數據都是以流的方式進行傳輸或保存的
  • 1.2、程序須要取數據的時候要使用輸入流讀取數據,而當程序須要將一些數據保存()到磁盤的時候,就要使用輸出流完成。
  • 1.3切記:程序是內,文件...是外

2、流的超類

2.1、字節流的超類:InputStream、OutputStream

  • 做用:處理字節、二進制對象。(其實可用於任何類型的對象,但它不能直接處理Unicode字符)
  • 操做對象:字節流處理單元爲1個字節,操做字節和字節數組

2.二、字符流的超類: Reader、Writer

  • 做用: 直接處理字符、字符串。
  • 操做對象:處理的單元爲2個字節的Unicode字符
  • 拓展:字符流是由Java虛擬機將字節轉化爲2個字節的Unicode字符爲單位的字符而成的

2.三、用途推薦

  • 音頻文件、圖片、歌曲,就用字節流好點
  • 關係到中文(文本)的,用字符流好點

2.四、前言:

其實前言放在這裏,筆者認爲是不合適的,以前的鋪墊只是方便讀者快讀進入狀態ios

  • 字節流和字符流的關係:
  • 字節流不足:實際開發中不少的數據是文本,字節流提供了處理任何類型的IO操做的功能,但它不能直接處理Unicode字符,因而提出了字符流的概念。
  • 字符流的誕生:字符流按虛擬機的encode處理,也就是經過InputStreamReader,OutputStreamWriter進行字符集的轉化數組

    • 轉化(注:初學者能夠不看該轉化知識,若是想了解原理,該段是有幫助的):函數

      • InputStreamReader:用於將一個字節流中的字節解碼成字符,其構造函數
        InputStreamReader isr = new InputStreamReader(InputStream in)的參數是一個InputStream對象 / System.in,用 對象.read(char[] data),的方式獲取內容
      • OutputStreamWriter:用於將寫入的字符編碼成字節後寫入一個字節流,其構造函數(之一)
        OutputStreamWriter osw = new OutputStreamWriter(OutputStream out)是一個OutputStream對象,一般用對象.write(String str)的方式寫到 對象綁定的輸出流上。
      • 兩者都是處理流(包裝流、非結點流)---不可直接操做數據!。由上可知兩者底層分別是經過byte[]和String來關聯它們對應的流對象!

3、字節流與字符流的區別

3.一、操做文件時的區別:

  • 字節流:在操做時不會用到緩衝區(內存),是直接對文件自己進行操做的
  • 字符流:在操做時則使用了緩衝區,經過緩衝區再操做文件。

3.二、存在形式區別:

  • 在硬盤上的全部文件都是以字節形式存在的(圖片,聲音,視頻),而字符值在內存中才會造成

4、分析與優化

  • 分析:學習

    • 對於3.1中的第一點:若是一個程序頻繁對一個資源進行IO操做,效率會很是低
  • 優化:優化

    • 此時,經過緩衝區,先把須要操做的數據暫時放入內存中,之後直接從內存中讀取數據,則能夠避免屢次的IO操做,提升效率。下面是部分代碼:編碼

      /*(1)對於視頻、圖片等文件的加緩衝優化*/
          byte[] fileToByteArray (String filePath){
              File des = new File(filePath);
              FileInputStream fis = new FileInputStream(des);
              ByteArrayOutputStream bios = new ByteArrayOutputStream();
              
              byte[] datas = new byte[1024];     //緩衝容器:提升效率`
              int len = -1;
              while ((len = fis.read(datas)) != -1){
                  bios.write(datas, 0, len); 
                 //把字節數組datas的內容 寫入到 字節數組輸出流 中--分段寫入
              }
              bios.flush();  //強制將緩衝區中的數據寫入輸出流,並清空緩衝區
              return bios.toByteArray();  
          }
          /*(2)對於純文本文件的加緩衝優化:*/
             //BufferedReader,內部其實維護一個緩衝字符數組
              String tempStr = "";
              try (FileReader fr = new FileReader("a.txt");
                   FileWriter fw = new FileWriter("b.txt");
                   BufferedWriter bw = new BufferedWriter(fw);
                   BufferedReader br = new BufferedReader(fr)){   //包裝:
      
                   while ((tempStr = br.readLine()) != null){
                      //將讀取的"一行"字符串寫入文件中
                      bw.write(tempStr);
                      //寫入下一行的時候,先換行
                      bw.newLine();
                  }
              }
              catch (IOException e){
                  e.printStackTrace();
              }
附:筆者並無把規範的代碼展現出來,只是把與本文相關的核心代碼展現給了你們你們有興趣能夠自行補充。內容其實很少,加多幾個try,catch語句便可! 但願做者的文章但願能夠被您採納,咱們一塊兒學習,共同進步!
相關文章
相關標籤/搜索