1. 程式人生 > >IO流(一)和深入遞迴

IO流(一)和深入遞迴

IO流(一)
1、什麼是IO流?
IO流是java提供用來實現輸入/輸出機制的基礎,通過輸入機制,程式可以讀取磁碟、光碟等儲存裝置上的資料;通過輸出機制,允許程式將資料輸出到磁碟、光碟等儲存裝置中
2、File類
2.1 File類簡介
File類是java.io包下的用來操作檔案和目錄的類。File類可以新建、刪除檔案和目錄,但是不能訪問檔案內容本身,如果需要訪問檔案內容本身,則需要使用IO流。
2.2 File類的初始化
public File(String pathname); 以pathname為路徑建立File物件;
public File(String parent, String child); 根據 parent 路徑名字串和 child 路徑名字串建立一個新 File 例項。
public File(File parent, String child); 根據 parent 表示的File物件和 child 路徑名字串建立一個新 File 例項
2.3 File類的常用方法
2.3.1 訪問檔名和檔案路徑的相關方法
● String getName(); 返回此File物件所表示的檔名或路徑名
● String getPath(); 返回此File物件所對應的路徑名
● Flie getAbsoluteFile(); 返回此物件所對應的絕對路徑所對應的File物件
● String getParent(); 返回此File物件所對應的目錄的父目錄名
● boolean renameTo(File newName); 重新命名此如果重新命名成File物件所對應的檔案或目錄,功,則返回true,否則返回false
2.3.2 檔案檢測的相關方法
● boolean exists(); 判斷File物件所對應的檔案或目錄是否存在
● boolean canWrite(); 判斷File物件所對應的檔案和目錄是否可寫
● boolean canRead(); 判斷File物件所對應的檔案和目錄是否可讀
● boolean isFile(); 判斷File物件所對應的是否是檔案,如果是檔案則返回true,如果是目錄則返回false
● boolean isDirectory(); 判斷File物件所對應的是否是目錄,如果是目錄則返回true,如果是檔案則返回false
● boolean isAbsolute(); 判斷File物件所對應的檔案或目錄是否是絕對路徑。
2.3.3 獲取檔案資訊的相關方法
● long lastModified(); 返回檔案的最後修改時間
● long length(); 返回檔案內容的長度
2.3.4 操作檔案的相關方法
● boolean createNewFile(); 當此File物件所對應的檔案不存在時,該方法將新建一個新檔案,如果建立成功則返回true,否則返回false
● boolean delete(); 刪除File物件所對應的檔案或路徑,如果路徑下有檔案則無法刪除
● static File createTempFile(String prefix, String suffix); 在預設的臨時檔案目錄中建立一個臨時的空檔案,使用給定的字首。系統生成的隨機數和給定的字尾作為檔名。
● static File createTempFile(String prefix, String suffix, File directory); 在directory所指定的目錄中建立一個臨時的空檔案。
● void deleteOnExit(); 註冊一個刪除鉤子,當Java虛擬機器退出時,刪除File物件所對應的檔案和目錄。
2.3.5 操作目錄的相關方法
● boolean mkdir(); 建立一個File物件所對應的目錄,如果成功則返回true。呼叫該方法時,File物件必須是一個路徑。
● boolean mkdirs(); 效果等同於mkdir()方法,只是mkdir()只會建立一級路徑,mkdirs()會建立多級
● String[] list(); 列出File物件的所有子檔名和路徑名,返回String陣列
● File[] listFiles(); 列出File物件的所有子檔案和路徑所對應的File物件陣列
● static File[] listRoots(); 列出系統所有的根路徑
2.4 File類的檔案過濾器
FileFilter是一個介面,如果要使用要實現它的方法
public boolean accept(File pathname) {
return true;
}
如果返回false的話,就過濾掉這個檔案或者目錄,如果返回true ,就代表這個檔案或者目錄加入到陣列中去。
注意
匿名內部類訪問外部的區域性變數時,區域性變數需要加final
Windows的路徑分隔符使用反斜槓(\),為Java程式中反斜槓表示轉義字元,所以應該使用兩條反斜槓,如果D:\Java\a.txt,或者直接使用斜槓(/)也可以
深入遞迴
1、遞迴的應用
1.1二分查詢法的遞迴實現
public static int search(int[] arr, int begin, int end, int value){
int middle = (begin + end) / 2;
if(arr[middle] == value){
return middle;
} else if(begin > end){
return -1;
} else if(arr[middle] > value){
return search(arr, begin, value);
} else if(arr[middle] < value){
return search(arr, middle + 1, end, value);
}
return -1;
}
1.2 漢諾塔問題
public static void hnt(int number, String from, String middle, String to){
if(number == 1){
System.out.println(“第1個盤子從” + from + “移動到” + to);
} else {
hnt(number - 1, from, to, middle);
System.out.println(“第” + (number) + “個盤子從” + from + “移動到” + to);
hnt(number - 1, middle, from, to);
}
}
2.歸併排序
2.1 歸併兩個有序陣列的實現
public static void main(String[] args) {
int[] arr1 = {1,2,4,10,14};
int[] arr2 = {7,11,16,20};
//歸併排序
int[] allarr = new int[arr1.length + arr2.length];
for(int i = 0, j = 0, k = 0; i < arr1.length || j < arr2.length; k++){
if(j == arr2.length || (i < arr1.length && arr1[i] <= arr2[j])){
allarr[k] = arr1[i];
i++;
} else if(i == arr1.length || (j < arr2.length && arr1[i] > arr2[j])){
allarr[k] = arr2[j];
j++;
}
}
for(int i = 0; i < allarr.length; i++){
System.out.print(allarr[i] + ” “);
}
}
2.2 歸併排序的實現
public static void guibinSort(int[] arr, int[] array, int begin, int end){
if(begin == end){
return;
}
int m = (begin + end) / 2;
guibinSort(arr, array, begin, m);
guibinSort(arr, array, m+1, end);
//合併
System.out.println(“歸併:” + begin + “-” + m + ” ” + (m+1) + “-” + end);
for(int i = begin, j = m + 1, index = 0; i <= m || j <= end; index++){
if(j > end || (i <= m && arr[i] < arr[j])){
array[index] = arr[i];
i++;
} else if(i > m || (j <= end && arr[i] >= arr[j])){
array[index] = arr[j];
j++;
}
}
//將array中排序好的資料更新到arr陣列中
for(int i = begin, j = 0; i <= end; i++, j++){
arr[i] = array[j];
}
}