1. 程式人生 > 其它 >Java案例——位元組流實現複製檔案(文字、圖片、視訊)

Java案例——位元組流實現複製檔案(文字、圖片、視訊)

一、位元組流複製文字檔案

需求:把E盤下的abc.txt檔案複製到F盤下的abc.txt中

分析:

1.複製文字檔案,其實就是把文字檔案的內容從一個檔案中讀出(資料來源),然後寫入到另一個檔案中(目的地)

2.資料來源:E:\\abc.txt ——>需要讀資料——>InputStream——>最終實現類FileInputStream

3.目的地:F:\\abc.txt——>需要寫資料——>OutputStream——>最終實現類FileInputStream

步驟:

1.根據資料來源建立位元組輸入流物件

2.根據目的地建立位元組輸出流物件

3.讀寫資料,複製文字檔案(一次讀取一個位元組、一次寫入一個位元組;)

4.釋放資源

/*需求:把E盤下的abc.txt檔案複製到F盤下的abc.txt中
分析:
1.複製文字檔案,其實就是把文字檔案的內容從一個檔案中讀出(資料來源),然後寫入到另一個檔案中(目的地)

2.資料來源:E:\\\abc.txt ——>需要讀資料——>InputStream——>最終實現類FileInputStream

3.目的地:F:\\\abc.txt——>需要寫資料——>OutputStream——>最終實現類FileInputStream
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製文字檔案(一次讀取一個位元組、一次寫入一個位元組;建議使用迴圈方式)
4.釋放資源
* */
public class Demo02 {
  public static void main(String[] args) throws IOException {
      //根據資料來源建立位元組輸入流物件
      FileInputStream fips=new FileInputStream("E:\\abc.txt");
      //根據目的地建立位元組輸出流物件
      FileOutputStream fops=new FileOutputStream("F:\\abc.txt");
      //讀寫資料,複製文字檔案(一次讀取一個位元組、一次寫入一個位元組;建議使用迴圈方式)
        int by;
      while((by=fips.read())!=-1){
          fops.write(by);
      }
      //釋放資源
      fops.close();
      fips.close();
  }
}

二、位元組流複製圖片

需求:把E盤下的123.jpg圖片複製到F盤下的123.jpgt中

步驟:

1.根據資料來源建立位元組輸入流物件

2.根據目的地建立位元組輸出流物件

3.讀寫資料,複製圖片(一次讀取一個位元組陣列資料、一次寫入一個位元組陣列資料;)

4.釋放資源

/*需求:把E盤下的123.jpg圖片複製到F盤下的123.jpgt中
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製圖片(一次讀取一個位元組陣列資料、一次寫入一個位元組陣列資料;)
4.釋放資源
* */
public class Demo03 {
  public static void main(String[] args) throws IOException {
      //根據資料來源建立位元組輸入流物件
      FileInputStream fips=new FileInputStream("E:\\123.jpg");
      FileOutputStream fops=new FileOutputStream("F:\\123.jpg");
      //讀寫資料,複製圖片(一次讀取一個位元組陣列資料、一次寫入一個位元組陣列資料;)
      byte[]bytes=new byte[1024];
      int len;
      while((len=fips.read(bytes))!=-1){
          fops.write(new String(bytes,0,len).getBytes);
          fops.flush();//清除快取
      }
      //釋放資源
      fops.close();
      fips.close();
  }
}

容易出現的問題:

我在寫完之後發現複製後的圖片雙擊打不開,再回去看程式碼,也沒幾行,我覺得問題應該是出在了位元組陣列轉字串再轉位元組陣列那一行,猜測應該是二進位制資料在轉成字串後出現了問題,再轉回去的資料不是之前的了,所以寫入的資料不是之前的圖片的二進位制資料,才會出現損壞或不被識別。 嘗試對這一行進行修改,既然轉String出現問題,那麼就不轉了,直接寫位元組陣列

/*需求:把E盤下的123.jpg圖片複製到F盤下的123.jpgt中
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製圖片(一次讀取一個位元組陣列資料、一次寫入一個位元組陣列資料;)
4.釋放資源
* */
public class Demo03 {
  public static void main(String[] args) throws IOException {
      //根據資料來源建立位元組輸入流物件
      FileInputStream fips=new FileInputStream("E:\\123.jpg");
      FileOutputStream fops=new FileOutputStream("F:\\123.jpg");
      //讀寫資料,複製圖片(一次讀取一個位元組陣列資料、一次寫入一個位元組陣列資料;)
      byte[]bytes=new byte[1024];
      int len;
      while((len=fips.read(bytes))!=-1){
          fops.write(bytes,0,len);
          fops.flush();//清除快取
      }
      //釋放資源
      fops.close();
      fips.close();
  }
}

完美解決!!!

三、位元組流複製視訊

需求:把E盤下的123.mp4圖片複製到F盤下的123.mp4t中

步驟:

1.根據資料來源建立位元組輸入流物件

2.根據目的地建立位元組輸出流物件

3.讀寫資料,複製視訊(4種方式,基本位元組流一次讀寫一個位元組、一次讀寫一個位元組陣列資料;位元組緩衝流一次讀寫一個位元組、一次讀寫一個位元組陣列)

4.釋放資源

/*需求:把E盤下的123.mp4圖片複製到F盤下的123.mp4
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製視訊(4種方式,基本位元組流一次讀寫一個位元組、一次讀寫一個位元組陣列資料;位元組緩衝流一次讀寫一個位元組、一次讀寫一個位元組陣列)
4.釋放資源
* */
public class Demo05 {
  public static void main(String[] args) throws IOException {
      //記錄開始時間
      long startime=System.currentTimeMillis();
      //方式一
      method1();
      //方式二
      method2();
      //方式三
      method3();
      //方式4
      method4();
      //記錄結束時間
      long endtime= System.currentTimeMillis();
      System.out.println("共用時"+(endtime-startime)+"毫秒");
  }
  //方法一,使用基本位元組流實現一次讀取一個位元組
  public static void method1() throws IOException {
      FileOutputStream fops=new FileOutputStream("F:\\123.mp4");
      FileInputStream fips=new FileInputStream("E:\\123.mp4");
      //一次讀取一個數據
      int by;
      while((by=fips.read())!=-1){
          fops.write(by);
      }
      fops.close();
      fips.close();

  }
  //方法二,一次讀取一個位元組陣列資料
  public static void method2() throws IOException {
      FileInputStream fips=new FileInputStream("E:\\123.mp4");
      FileOutputStream fops=new FileOutputStream("F:\\123.mp4");
      //一次讀取一個數據
      byte []bytes=new byte[1024];
      int len;
      while((len=fips.read(bytes))!=-1){
          fops.write(bytes,0,len);
      }
      fops.close();
      fips.close();

  }
  //方法三,使用位元組緩衝流一次讀取一個位元組
  public static void method4() throws IOException {
      //建立位元組緩衝流物件
      BufferedInputStream bips=new BufferedInputStream(new FileInputStream("E:\\123.mp4"));
      BufferedOutputStream bops=new BufferedOutputStream(new FileOutputStream("F:\\123.mp4"));
      //一次讀取一個位元組資料
      int by;
      while((by=bips.read())!=-1){
          bops.write(by);
      }
      bips.close();
      bops.close();

  }
  //方法四,使用位元組緩衝流一次讀取一個位元組陣列資料
  public static void method3() throws IOException {
      //建立位元組緩衝流物件
      BufferedInputStream bips=new BufferedInputStream(new FileInputStream("E:\\123.mp4"));
      BufferedOutputStream bops=new BufferedOutputStream(new FileOutputStream("F:\\123.mp4"));
      //一次讀取一個位元組陣列資料
      byte []bytes=new byte[1024];
      int len;
      while((len=bips.read(bytes))!=-1){
          bops.write(bytes,0,len);
      }
      bips.close();
      bops.close();

  }
}