FileInputStream是InputStream的子類,由名稱上就可以知道, FileInputStream主要就是從指定的檔案中讀取資料至目的地。
FileOutputStream是OutputStream的子類,顧名思義,FileOutputStream主要就是從來源地寫入資料至指定的檔案中。
標準輸入輸出串流物件在程式一開始就會開啟,但只有當您建立一個FileInputStream或FileOutputStream的實例時,實際的串流才會開啟,而不使用串流時,也必須自行關閉串流,以釋放與串流相依的系統資源。
下面這個程式可以複製檔案,程式先從來源檔案讀取資料至一個位元緩衝區中,然後再將位元陣列的資料寫入目的檔案:
package onlyfun.caterpillar; import java.io.*; public class FileStreamDemo { public static void main(String[] args) { try { byte[] buffer = new byte[1024];
FileInputStream fileInputStream = new FileInputStream(new File(args[0])); FileOutputStream fileOutputStream = new FileOutputStream(new File(args[1]));
System.out.println("複製檔案:" + fileInputStream.available() + "位元組"); int length = -1; // 從來源檔案讀取資料至緩衝區 while((length = fileInputStream.read(buffer)) != -1) { // 將陣列資料寫入目的檔案 fileOutputStream.write(buffer, 0, length); }
// 關閉串流 fileInputStream.close(); fileOutputStream.close();
System.out.println("複製完成"); } catch(ArrayIndexOutOfBoundsException e) { System.out.println( "using: java FileStreamDemo src des"); e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } } }
這個程式示範了兩個 read() 方法,一個可以讀入指定長度的資料至陣列,一個一次可以讀入一個位元組,每次讀取之後,讀取的指標都會往前進,您使用available()方
法獲得還有多少位元組可以讀取,在這邊則是在進行讀取前,使用available()來先取得總共可讀取的位元數,也就是剛好等於檔案大小;除了使用
File來建立FileInputStream、FileOutputStream的實例之外,您也可以直接使用字串指定路徑來建立。
不使用串流時,記得使用close()方法自行關閉串流,以釋放與串流相依的系統資源。 |
|