1. 程式人生 > >《Java程式設計思想》學習筆記10——檔案和目錄常用操作

《Java程式設計思想》學習筆記10——檔案和目錄常用操作

1.檔案目錄的List操作:

Java中,File類其實代表檔案的路徑,它既可以代表一個特定檔案的檔案,也可以代表一個包含多個檔案的目錄名稱。如果File代表目錄,可以使用List列出目錄中檔案。

  1. import  java.util.regex.*;  
  2. import  java.io.*;  
  3. import  java.util.*;  
  4. publicclass DirList{  
  5.     publicstaticvoid main(String[] args){  
  6.         //當前目錄
  7.         File path = new File(“.”);  
  8.         String[] list;  
  9.         //如果沒有指定引數,則將目錄中檔案全部列出
  10.         if(args.length == 0){  
  11.     list = path.list();  
  12. }  
  13. //指定了引數,則根據指定檔名過濾符合條件的檔案
  14. else{  
  15.     list = path.list(new DirFilter(args[0]));  
  16. }  
  17. Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);  
  18. for(String dirItem : list){  
  19.     System.out.println(dirItem);  
  20. }  
  21. }  
  22. }  
  23. class DirFilter implements FilenameFilter{  
  24.     private Pattern pattern;  
  25.     public DirFilter(String regex){  
  26.         //將輸入的命令列引數編譯為正則表示式的模式串
  27.         pattern = Pattern.compile(regex);  
  28. }  
  29. //File的List方法回撥方法
  30. publicboolean accept(File dir, String name){  
  31.     //使用正則表示式匹配給定目錄下的檔名
  32.     return pattern.matcher(name).matches();  
  33. }   
  34. }  

命令列輸入引數:“*\.java”

輸出結果如下:

DirFilter.java

DirList.java

2.java中除了File類可以表示檔案的路徑外,還可以表示目錄的路徑,可以通過File的isDirectory判斷File物件是一個檔案還是一個目錄。

如下的例子通過local()方法列出給定目錄中符合條件的檔案/目錄名稱,walk()方法遍歷給定的目錄:

  1. import java.util.regex.*;  
  2. import java.io.*;  
  3. import java.util.*;  
  4. publicfinalclass Directory{  
  5.     //列出目錄中符合條件的檔名
  6.     publicstatic File[] local(File dir, final String regex){  
  7.         return dir.listFiles(new FilenameFilter(){  
  8.             private Pattern pattern = Pattern.compile(regex);  
  9.             public Boolean accept(File dir, String name){  
  10.                 return pattern.matcher(new File(name).getName()).matches();  
  11. }  
  12. });  
  13. }  
  14. //過載列出目錄下符合條件的檔名方法
  15. publicstatic File[] local(String path, final String regex){  
  16.     return local(new File(path), regex);  
  17. }   
  18. //代表檔案樹資訊的靜態內部類
  19. publicstaticclass TreeInfo implements Iterable<File>{  
  20.     public List<File> files = new ArrayList<File>();  
  21.     public List<File> dirs = new ArrayList<File>();  
  22.     //預設的迭代器方法,跌倒檔案樹元素物件
  23.     public Iterator<File> iterator(){  
  24.         return files.iterator();  
  25. }   
  26. void addAll(TreeInfo other){  
  27.     files.addAll(other.files);  
  28.     dirs.addAll(other.dirs);  
  29. }  
  30. public String toString(){  
  31.     return “dirs: ” + dirs + “\n\nfiles: ” + files;  
  32. }  
  33. }  
  34. //從指定的檔案/目錄開始遍歷符合條件的檔案
  35. publicstatic TreeInfo walk(String start, String regex){  
  36.     return recurseDirs(new File(start), regex);  
  37. }  
  38. //過載遍歷檔案/目錄方法
  39. \publicstatic TreeInfo walk(File start, String regex){  
  40.     return recurseDirs(start, regex);  
  41. }  
  42. //預設的指定檔案/目錄查詢任何檔名的檔案
  43. publicstatic TreeInfo walk(File start){  
  44.     return recurseDirs(start, “.*”);  
  45. }  
  46. //過載預設的查詢任何檔案的方法
  47. publicstatic TreeInfo walk(String start){  
  48.     return recurseDirs(new File(start), “.*”);  
  49. }   
  50. //從指定的檔案/目錄開始遍歷,查詢符合條件的檔名
  51. static TreeInfo recurseDirs(File startDir, String regex){  
  52.     TreeInfo result = new TreeInfo();  
  53.     for(File item : startDir.listFiles()){  
  54.         //如果遍歷的檔案是目錄    
  55. if(item.isDirectory()){  
  56.     result.dirs.add(item);  
  57.     //迭代子目錄
  58.     result.addAll(recurseDirs(item, regex));  
  59. }  
  60. //如果遍歷的的檔案是普通檔案
  61. else{  
  62.     if(item.getName().matches(regex)){  
  63.         result.files.add(item);  
  64. }  
  65. }  
  66. }  
  67. return result;  
  68. }  
  69. }  

3.檔案和目錄的其他操作:

檔案和目錄除了常規的查詢和遍歷操作意外,還有很多其他的操作,例如:建立、刪除、判斷檔案/目錄是否已存在,獲取檔案/目錄的絕對路徑,獲取檔案/目錄的許可權等等,下面的小例子就展示檔案/目錄的這些操作:

  1. import java.io.*;  
  2. publicclass MakeDirectories{  
  3.     //獲取檔案/目錄的基本資訊
  4. privatestaticvoid fileData(File f){  
  5.         System.out.println(  
  6.     “Absolute path: ” + f.getAbsolutePath() +  
  7.     “\n Can read: ” + f.canRead() +  
  8.     “\n Can write: ” + f.canWrite() +  
  9.     “\n getName: ” + f.getName() +   
  10.     “\n getParent: ” + f.getParent() +  
  11.     “\n getPath: ” + f.getPath() +  
  12.     “\n length: ” + f.length() +  
  13.     “\n lastModified: ” + f.lastModifed());  
  14. if(f.isFile()){  
  15.     System.out.println(f.getName() + “ is a file”);  
  16. }  
  17. elseif(f.isDirectory()){  
  18. System.out.println(f.getName() + “ is a directory”);  
  19. }  
  20. }  
  21. publicstaticvoid main(String[] args){  
  22.     File old = new File(“oldFile”);  
  23.     File new = new File(“newFile”);  
  24.     old.renameTo(new);  
  25.     fileData(old);  
  26.     fileData(new);  
  27.     File d = new File(“/test”);  
  28.     if(d.exists()){  
  29.     System.out.println(“Deleting …” + d);  
  30.     d.delete();  
  31. }  
  32. else {  
  33.     System.out.prinln(“Creating…” + d);  
  34.     d.mkdirs();  
  35. }  
  36. }  
  37. }