1. 程式人生 > >OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四種復制方式-單層文件夾復制

OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四種復制方式-單層文件夾復制

操作 spa rec row 讀取 換行 耗時 數據 bar

字節流兩套:
java.lang.Object--java.io.OutputStream--java.io.FileOutputStream
java.lang.Object--java.io.InputStream--java.io.FileInputStream
==================================================================
一.OutputStream 抽象類(java.io) 字節輸出流
概述:OutputStream 類就是專門用於從程序中將數據寫入到介質中;
定義:public abstract class OutputStream extends Object implements Closeable, Flushable
OutputStream 類:此抽象類是表示輸出字節流的所有類的超類。
Direct Known Subclasses:FileOutputStream,PipedOutputStream
註意:io流不能操作文件夾(文件夾中當然不能直接寫內容!!!)
操作的最小單位是bit(位)
存儲的最小單位是byte(字節)
1byte = 8 bit
構造方法:OutputStream()
常用方法:
public void close() throws IOException{}: 關閉流
public void flush() throws IOException{}: 刷新流
public void write(byte[] b) throws IOException{}:-->輸出流對象
public void write(byte[] b, int off, int len) throws IOException{}:-->輸出流對象
抽象方法: public abstract write(int b):(抽象方法) -->輸出流對象

二.FileOutputStream 類(java.io)字節輸出流的子類
概述:OutputStream 常用子類;
構造方法:該類使用構造方法時,可直接創建文件,若文件存在則直接覆蓋,想要不被覆蓋,構造時傳入參數(true);
FileOutputStream(String name) throws FileNotFoundException:創建一個向具有指定名稱的文件中寫入數據的輸出文件流。
Name 表示一個文件的路徑,可以是相對的也可以是絕對的!
FileOutputStream(File file) throws FileNotFoundException:創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流.
續寫:
FileOutputStream(File file, boolean append) throws FileNotFoundException:創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流
需要傳遞append的值為:true即可,則不覆蓋已存在文件,而是在文件後續寫;
FileOutputStream(String name, boolean append)throws FileNotFoundException:創建一個向具有指定 name 的文件中寫入數據的輸出文件流。
換行:
使用字符流的時候,可以直接寫入:“\r\n”;
使用字節流的時候,需要寫入“\r\n”的字節數組;
常用方法:
public void write(byte[] b) throws IOException{}: b.length 個字節從指定 byte 數組寫入此文件輸出流中。
public void write(byte[] b, int off, int len) throws IOException{}:將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此文件輸出流。
public void write (int b) throws IOException{}:將指定字節個數寫入此文件輸出流.
public void close() throws IOException{}:關閉此文件輸出流並釋放與此流有關的所有系統資源。

繼承OutputStream抽象類的flush()方法

String 類的一個常用方法:
public byte[] getBytes(){}:使用平臺的默認字符集將此 String 拆分為 byte 序列,並將結果存儲到一個新的 byte 數組中。
======================================================================
java.lang.Object--java.io.InputStream--java.io.FileInputStream
======================================================================
三.InputStream 抽象類(java.io) 字節輸入流
定義:public abstract class InputStream extends Object implements Closeable
概述:InputStream 此抽象類是表示字節輸入流的所有類的超類。
Direct Known Subclasses:FileInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream
抽象方法:
public abstract int read() throws IOException:
常用方法:
public int read(byte[] b) throws IOException{}:讀取字節數組;
public int read(byte[] b, int off, int len) throws IOException{}:讀取部分字節數組;
public void close() throws IOException{}:關閉流;


四.FileInputStream 類(java.io) 字節輸入流的子類
概述:InputStream 類的常用子類;FileInputStream 類是專門用於從文件中讀取字節數據的流,讀取到的內容以十進制的數據的形式返回;
如果想要將十進制的數據轉換成對應的字符,需要程序員對照碼表轉換;
具體轉換方式有2種:
1:直接強轉成char類型的字符;(適用於一個數字)
2:使用String類的構造方法;(適用於一個或多個數字)
構造方法:
FileInputStream(String name) throws FileNotFoundException:通過打開一個到實際文件的連接來創建一個 FileInputStream,
該文件通過文件系統中的路徑名 name 指定。
FileInputStream(File file) throws FileNotFoundException:通過打開一個到實際文件的連接來創建一個 FileInputStream,
該文件通過文件系統中的 File 對象 file 指定。
常用方法:
public int read() throws IOException {}:從此輸入流中讀取一個數據字節。返回的是讀取到的這個字節的碼值!
public int read(byte[] b) throws IOException {}:從此輸入流中將最多 b.length 個字節的數據讀入一個 byte 數組中。返回的是讀取到的字節的個數!
public int read(byte[] b, int off, int len) throws IOException {}:從此輸入流中將最多 len 個字節的數據讀入一個 byte 數組中。返回的是讀取到的字節的個數!
public void close() throws IOException{}:關閉此文件輸入流並釋放與此流有關的所有系統資源。
====================================================================
高效字節流兩套:
java.lang.Object--java.io.OutputStream--java.io.FilterOutputStream--java.io.BufferedOutputStream
java.lang.Object--java.io.InputStream--java.io.FilterInputStream--java.io.BufferedInputStream
==================================================================
五.BufferedOutputStream 類(java.io)
定義:public class BufferedOutputStream extends FilterOutputStream
屬於OutputStream的孫子類
構造方法:BufferedOutputStream(OutputStream out) 創建一個新的緩沖輸出流,以將數據寫入指定的底層輸出流。
常用方法:
public void flush() throws IOException{}:
public void write(byte[] b, int off, int len) throws IOException{}:
public void write(int b) throws IOException{}:

繼承自FilterOutputStream的close()方法;

六.BufferedInputStream 類(java.io)
定義:public class BufferedInputStream extends FilterInputStream
構造方法:BufferedInputStream(InputStream in) 創建一個 BufferedInputStream 並保存其參數,即輸入流in,以便將來使用。
常用方法:
public void close() throws IOException{}:關閉流;
public int read() throws IOException{}:讀取;
public int read(byte[] b, int off, int len) throws IOException{}:以字節數組形式讀取;

=============================================================
七.四種方式復制文件:
1:高效字節流加數組

技術分享圖片
  1 //1:高效流加數組,復制"E:\\JAVAPractice\\IO\\1.jpg"
  2  import java.io.BufferedInputStream;
  3  import java.io.FileInputStream;
  4  import java.io.BufferedOutputStream;
  5  import java.io.FileOutputStream;
  6  import java.io.IOException;
  7  public class Copy01{
  8      public static void main(String[] args) throws IOException{
  9          //抓取開始時間
 10         long t1 = System.currentTimeMillis();
 11          //創建高效流
 12         BufferedInputStream bin = new BufferedInputStream(new FileInputStream("E:\\JAVAPractice\\IO\\1.jpg"));
 13          BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("E:\\JAVAPractice\\IO\\1_1.jpg"));
 14          //定義字節數組存儲讀取內容
 15         byte[] b = new byte[1024];
 16          int i = -1;//讀取到的字節個數
 17         while((i = bin.read(b)) != -1){
 18              bout.write(b,0,i);
 19              bout.flush();
 20          }
 21          bout.close();
 22          bin.close();
 23          //抓取程序結束時間
 24         long t2 = System.currentTimeMillis();
 25         System.out.println("耗時:"+(t2-t1)/1000.0);//耗時:0.25
 26      }
 27  }
技術分享圖片

2:基本字節流加數組

技術分享圖片
  1 //2:基本流加數組,復制"E:\\JAVAPractice\\IO\\1.jpg
  2  import java.io.FileOutputStream;
  3  import java.io.FileInputStream;
  4  import java.io.IOException;
  5  public class Copy02{
  6      public static void main(String[] args) throws IOException{
  7          //記錄程序開始時間
  8         long t1 = System.currentTimeMillis();
  9          //創建基本字節流對象
 10         FileInputStream in = new FileInputStream("E:\\JAVAPractice\\IO\\1.jpg");
 11          FileOutputStream out = new FileOutputStream("E:\\JAVAPractice\\IO\\1_2.jpg");
 12          //定義數組存儲讀取到的數據
 13         byte[] b = new byte[1024];
 14          int i = -1;//讀取到的字節個數
 15         while((i = in.read(b)) != -1){
 16              out.write(b,0,i);
 17              out.flush();
 18          }
 19          //關閉流
 20         in.close();
 21          out.close();
 22          //記錄程序結束時間
 23         long t2 = System.currentTimeMillis();
 24          System.out.println("耗時:"+(t2-t1)/1000.0);//耗時:0.344
 25      }
 26  }
技術分享圖片

3:高效字節流逐字節

技術分享圖片
  1 //3:高效流逐字節,復制"E:\\JAVAPractice\\IO\\1.jpg
  2  import java.io.BufferedInputStream;
  3  import java.io.FileInputStream;
  4  import java.io.BufferedOutputStream;
  5  import java.io.FileOutputStream;
  6  import java.io.IOException;
  7  public class Copy03{
  8      public static void main(String[] args) throws IOException{
  9          //記錄系統時間
 10         long t1 = System.currentTimeMillis();
 11          //創建高效字符流
 12         BufferedInputStream bin = new BufferedInputStream(new FileInputStream("E:\\JAVAPractice\\IO\\1.jpg"));
 13          BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("E:\\JAVAPractice\\IO\\1_3.jpg"));
 14          //定義i為ASCII碼值
 15         int i = -1;
 16          while((i = bin.read()) != -1){
 17              bout.write(i);
 18          }
 19          //關閉流
 20         bin.close();
 21          bout.close();
 22          //記錄系統時間
 23         long t2 = System.currentTimeMillis();
 24          System.out.println("耗時:"+(t2-t1)/1000.0);//耗時:0.625
 25      }
 26  }
技術分享圖片

4:基本字節流逐字節復制

技術分享圖片
  1 //4:基本流逐字節復制,E:\\JAVAPractice\\IO\\1.jpg
  2  import java.io.FileInputStream;
  3  import java.io.FileOutputStream;
  4  import java.io.IOException;
  5  public class Copy04{
  6      public  static void main(String[] args) throws IOException{
  7          //記錄系統時間
  8         long t1 = System.currentTimeMillis();
  9          //創建基本字節流對象
 10         FileInputStream in = new FileInputStream("E:\\JAVAPractice\\IO\\1.jpg");
 11          FileOutputStream out = new FileOutputStream("E:\\JAVAPractice\\IO\\1_4.jpg");
 12          //定義不在ASCII碼值範圍內的i
 13          int i = -1;
 14          while((i = in.read()) != -1){
 15              out.write(i);
 16              out.flush();
 17          }
 18          //關閉流
 19         out.close();
 20          in.close();
 21          //記錄系統時間
 22         long t2 = System.currentTimeMillis();
 23          System.out.println("耗時:"+(t2-t1)/1000.0);//耗時:52.383
 24      }
 25  }
技術分享圖片


===============================
八.單層文件夾復制

技術分享圖片
  1 //復制E:\\JAVAPractice\\IO\\demo該單層文件夾下所有txt格式文件
  2 import java.io.File;
  3  import java.io.IOException;
  4  import java.io.FileInputStream;
  5  import java.io.FileOutputStream;
  6  public class DirCopy{
  7      public static void main(String[] args) throws IOException{
  8          //創建源文件夾對象
  9         File src = new File("E:\\JAVAPractice\\IO\\demo");
 10          //創建目標文件夾對象
 11         File dest = new File("E:\\JAVAPractice\\IO\\democopy");
 12          dest.mkdir();
 13          //獲取源文件夾中所有對象
 14         File[] files = src.listFiles();
 15          //叠代
 16         for(File f : files){
 17             //將所有文件包裝成輸入流對象
 18             FileInputStream in = new FileInputStream(f);
 19              //i表示讀取的字節數
 20             int i = -1;
 21              byte[] b = new byte[1024];
 22              //準備輸出流對象
 23             File fileOut = new File(dest,f.getName());
 24              FileOutputStream out = new FileOutputStream(fileOut);
 25              while((i = in.read(b)) != -1){
 26                  out.write(b,0,i);
 27                  out.flush();
 28              }
 29              out.close();//out在foreach內定義,所以在foreach內關閉
 30             in.close();//同上
 31         }
 32          System.out.println("操作完成");
 33      }
 34  }
技術分享圖片

多層文件夾復制--遞歸調用???

OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四種復制方式-單層文件夾復制