OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四種復制方式-單層文件夾復制
字節流兩套:
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-四種復制方式-單層文件夾復制