[align=center][size=x-large]輸入輸出流[/size][/align]
[size=large]在java中如果我們想要實作檔案的查找,需要用到File類,實作檔案的複制操作就需要用到輸入輸出流了,其中:所有的輸入流類都是抽象類InputStream(位元組輸入流)或抽象類Reader(字元輸入流)的子類,而所有的輸出流都是抽象類OutputStream(位元組輸出流)或抽象類Writer(字元輸出流)的子類,下面我們先來認識一下File類。
File類:
File類的對象通常用來擷取檔案本身的一些資訊,例如檔案所在的目錄、檔案的長度、檔案的讀寫權限等,但是,不涉及檔案的讀寫操作。
首先,file的構造方法有4個[table]
||File(File parent, String child) || 根據 parent 抽象路徑名和child 路徑名字元串建立一個新 File 執行個體。
||File(String pathname) || 通過将給定路徑名字元串轉換為抽象路徑名來建立一個新 File 執行個體。
||File(String parent, String child) || 根據 parent 路徑名字元串和 child 路徑名字元串建立一個新 File 執行個體。
||File(URI uri) || 通過将給定的 file: URI 轉換為一個抽象路徑名來建立一個新的 File 執行個體。
[/table]
我們可以根據不同的需求來用它的構造方法。下面是一個小小的檔案搜尋器的根據路徑和關鍵字查找檔案夾和檔案的方法實作:[/size]
//按路徑搜尋檔案的方法
public int printDir(String name){
//int count1=0;
//将檔案名封裝成檔案對象
File dir=new File(name);
//清單目錄
File[] files=dir.listFiles();
if(files!=null&&files.length!=0){//當不是空目錄或檔案
for(int i=0;i<files.length;i++){
if(files[i].isDirectory()){//如果是目錄
//得到絕對路徑
String path=files[i].getAbsolutePath();
printDir(path);
}
else if(files[i].isFile()){
String path1=files[i].getAbsolutePath();
area.append(path1+"\n");
count1++;
}
}
}
return count1;
}
//按路徑搜尋檔案夾的方法
public int printDirs(String name){
// /int count2=0;
//将檔案名封裝成一個檔案對象
File dirs=new File(name);
//清單目錄
File[] files=dirs.listFiles();
if(files.length!=0&&files!=null){
for(int i=0;i<files.length;i++){
if(files[i].isDirectory()){
count2++;
//得到目錄的絕對路徑
String path=files[i].getAbsolutePath();
area.append(path+"\n");
}
}
}
return count2;
}
//按關鍵字搜檔案的方法
public int key(String name,String keys){
//此處的name會預設設為E盤
String knum=keys;
//将檔案名封裝成一個檔案對象
File dir=new File(name);
File[] files=dir.listFiles();
if(files!=null&&files.length!=0){
for(int i=0;i<files.length;i++){
if(files[i].isDirectory()){
//得到檔案夾的絕對路徑
String path=files[i].getAbsolutePath();
//遞歸調用檔案的方法
key(path,knum);
}
else if(files[i].isFile()){//如果是檔案,則判斷檔案名中是否包含關鍵字
//得到檔案的名字
String names=files[i].getName();
if(names.contains(keys)){//如果檔案名中包含關鍵字
//得到檔案的絕對路徑
String paths=files[i].getAbsolutePath();
area.append(paths+"\n");
count3++;
}
}
}
}
return count3;
}
[size=large]FileInputStream類和FileOutputStream類:
如果我們對檔案的讀取要求很簡單的話,可以用 FileInputStream類,該類的執行個體方法是從inputstream類中繼承來的。我們就從複制一個小檔案來分析這兩個類。
要複制一個檔案,我們要做的就是獲得檔案路徑----->将檔案内容取出------->将取出的檔案寫入指定的路徑中
這裡有兩個動作:讀出檔案和寫入檔案
讀檔案我們可以用到FileInputStream類中的read方法,它又分幾種讀入形式,例如read();是不帶參數的,read(byte[]);是帶有一個位元組數組參數的方法,另外的我們可以在jdk中找到.
寫檔案就可以用到FileOutputStream類中的write(byte[]);方法,和read一樣,它也有幾種帶參數的形式。[table]
||write(byte[] b) || 将 b.length 個位元組從指定 byte 數組寫入此檔案輸出流中。
||write(byte[] b, int off, int len) || 将指定 byte 數組中從偏移量 off 開始的 len 個位元組寫入此檔案輸出流。
||write(int b) || 将指定位元組寫入此檔案輸出流[/size][/table]
下面是一個複制檔案的例子: