1. 程式人生 > >動手動腦06+課後作業

動手動腦06+課後作業

1.使用Files. walkFileTree()找出指定資料夾下所有大於指定大小(比如500M)的檔案。

 1 package dsydn1;
 2 import java.io.IOException;
 3 import java.nio.file.FileSystems;
 4 import java.nio.file.FileVisitOption;
 5 import java.nio.file.FileVisitResult;
 6 import java.nio.file.FileVisitor;
 7 import java.nio.file.Files;
 8 import
java.nio.file.Path; 9 import java.nio.file.PathMatcher; 10 import java.nio.file.Paths; 11 import java.nio.file.attribute.BasicFileAttributes; 12 import java.util.EnumSet; 13 public class Search implements FileVisitor { 14 private final PathMatcher matcher; 15 private final long accepted_size; 16 public
Search(String glob,long accepted_size) { 17 matcher= FileSystems.getDefault().getPathMatcher("glob:" +glob); 18 this.accepted_size=accepted_size; 19 } 20 void search(Path file) throws IOException { 21 long size = (Long) Files.getAttribute(file, "basic:size"); 22 if(size >=accepted_size) {
23 System.out.println(file); 24 } 25 } 26 @Override 27 public FileVisitResult postVisitDirectory(Object dir, IOException exc)throws IOException { 28 return FileVisitResult.CONTINUE; 29 } 30 @Override 31 public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)throws IOException { 32 return FileVisitResult.CONTINUE; 33 } 34 @Override 35 public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)throws IOException { 36 search((Path) file); 37 return FileVisitResult.CONTINUE; 38 } 39 @Override 40 public FileVisitResult visitFileFailed(Object file, IOException exc)throws IOException { 41 return FileVisitResult.CONTINUE; 42 } 43 public static void main(String[] args) throws IOException{ 44 System.out.println("D盤中大小大於500M的檔案有"); 45 String glob= "*.txt"; 46 long size = 1048576*500;//1M=1024k=1048576位元組 47 Path fileTree = Paths.get("D:/"); 48 Search walk=new Search(glob, size); 49 EnumSet opts=EnumSet.of(FileVisitOption.FOLLOW_LINKS); 50 51 Files.walkFileTree(fileTree, opts, Integer.MAX_VALUE, walk); 52 } 53 }

2.使用Files. walkFileTree()找出指定資料夾下所有副檔名為.txt和.exe的檔案。

1 package dsydn2;
 2 import java.io.IOException;
 3 import java.nio.file.FileSystems;
 4 import java.nio.file.FileVisitResult;
 5 import java.nio.file.Files;
 6 import java.nio.file.Path;
 7 import java.nio.file.PathMatcher;
 8 import java.nio.file.Paths;
 9 import java.nio.file.SimpleFileVisitor;
10 import java.nio.file.attribute.BasicFileAttributes;
11 public class FileGlobNIO {
12     public static void main(String args[]) throws IOException {
13         String glob = "glob:**/*.{exe,txt}";
14         String path = "D:/";
15         match(glob, path);
16     }
17     public static void match(String glob, String location) throws IOException {
18         final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher( glob);
19         Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {
20             @Override
21             public FileVisitResult visitFile(Path path,
22                     BasicFileAttributes attrs) throws IOException {
23                 if (pathMatcher.matches(path)) {
24                     System.out.println(path);
25                 }
26                 return FileVisitResult.CONTINUE;
27             }
28             @Override
29             public FileVisitResult visitFileFailed(Path file, IOException exc)
30                     throws IOException {
31                 return FileVisitResult.CONTINUE;
32             }
33         });
34     }
35 }

3. 使用Files. walkFileTree()找出指定資料夾下所有包容指定字串的txt檔案。

 1 package dsydn3;
 2 import java.io.IOException;
 3  import java.io.*;
 4  import java.nio.file.FileSystems;
 5  import java.nio.file.FileVisitResult;
 6  import java.nio.file.Files;
 7  import java.nio.file.Path;
 8  import java.nio.file.PathMatcher;
 9  import java.nio.file.Paths;
10  import java.nio.file.SimpleFileVisitor;
11  import java.nio.file.attribute.BasicFileAttributes;
12  
13  public class FileGlobNIO {
14  
15      public static void main(String args[]) throws IOException {
16          String glob = "glob:**/*.txt";
17          String path = "D:/";
18          match(glob, path);
19      }
20  
21      public static void match(String glob, String location) throws IOException {
22  
23          final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher( glob);
24  
25          Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {
26  
27              @Override
28              public FileVisitResult visitFile(Path path,
29                      BasicFileAttributes attrs) throws IOException {
30                  if (pathMatcher.matches(path)) {
31                   BufferedReader reader =Files.newBufferedReader(path);
32                    String line=null;
33                    while((line = reader.readLine())!=null) {
34                     if(line.equals("public"))
35                     {
36                           System.out.println(path);
37                           break;
38                     }
39                     
40                    }
41                  }
42                    return FileVisitResult.CONTINUE;
43              }
44  
45              @Override
46              public FileVisitResult visitFileFailed(Path file, IOException exc)
47                      throws IOException {
48                  return FileVisitResult.CONTINUE;
49              }
50          });
51      }
52  }

4.請通過查詢JDK檔案和使用搜索引擎等方式,看懂此示例程式碼,並弄明白Watchable、WatchService等型別之間的關係,使用UML類圖表示出這些類之間的關係? 

WatchService 
看作是檔案監控器,通過作業系統原生檔案系統來執行。 
針對單點多appkey的情況,可以註冊開啟多個監控器。 
每個監控器可看作是後臺執行緒,通過監控檔案發出的訊號來實現監控。

WatchService 用來觀察被註冊了的物件所有的變化和事件

Watchable 被觀察者,與WatchService結合使用, java.nio.file.Path 已經實現 

WatchService 例項化: 

WatchService watchService = FileSystems.getDefault().newWatchService(); 

利用 Path 例項化監控物件 Watchable 

Path dir = Paths.get(path); 

將 Path 註冊到 WatchService 中//這裡監控檔案的 建立、修改、刪除  但是這裡返回的key裡面的監控資訊為空 

WatchKey key = dir.register(watchService, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);   

監控池是靜態的,只有當你主動去獲取新的監控池時才會有更新的內容加入監控池。這就造成了系統接收到監控資訊事件可能稍長的問題。 

1,java.nio.file.WatchService檔案系統監視服務的介面類,它的具體實現由監視服務提供者負責載入。 

2,ava.nio.file.Watchable 實現了 java.nio.file.Watchable 的物件才能註冊監視服務 WatchService。java.nio.file.Path實現了 watchable 介面,後文使用 Path 物件註冊監視服務。 

 3,java.nio.file.WatchKey 該類代表著 Watchable 物件和監視服務 WatchService 的註冊關係。WatchKey 在 Watchable 物件向 WatchService 註冊的時候被建立。它是 Watchable 和 WatchService 之間的關聯類。

課後作業:

一:編寫一個程式,指定一個資料夾,能自動計算出其總容量

 1 package class6;
 2 
 3 import java.io.File;
 4 import java.util.ArrayList;
 5  
 6 public class Size {
 7    static long size=0;
 8  private static ArrayList<String> filelist=new ArrayList<String>();
 9  public static void main(String[] args) {
10   Size s=new Size();
11   String filePath="F:\\天梯賽";
12   s.getFiles(filePath);
13   
14  }
15  //通過遞迴得到某一路徑下所有的目錄及檔案
16 void getFiles(String filePath) {
17   
18  File root=new File(filePath);
19   File[] files=root.listFiles();
20   for(File file:files) {
21   if(file.isDirectory()) {
22     getFiles(file.getAbsolutePath());
23    filelist.add(file.getAbsolutePath());
24    }else {
25     size+=file.getAbsolutePath().length();
26    }
27 System.out.println("大小是"+size);
28   }  
29 }

2.編寫一個檔案加解密程式,通過命令列完成加解密工作

 1 package text5_3;
 2 import java.io.File;
 3 import java.io.InputStream;
 4 import java.io.OutputStream;
 5 import java.io.FileInputStream;
 6 import java.io.FileOutputStream;
 7 
 8 public class FileCode {
 9  private static final int numOfEncAndDec=0x99;//加密解密金鑰
10  private static int dataOfFile=0;//檔案位元組內容
11 
12  public static void main(String[] args) {
13   File srcFile=new File("D:\\poem.txt");//初始化檔案
14   File encFile=new File("D:\\poem.txt"); //加密檔案
15   File decFile=new File("D:\\poem.txt");  //解密檔案
16  
17   try {
18    EncFile(srcFile,encFile);  //加密操作
19    DecFile(encFile,decFile);
20   }catch(Exception e) {
21    e.printStackTrace();
22   }
23  }
24  private static void EncFile(File srcFile,File encFile)throws Exception{
25   if(!srcFile.exists()) {
26    System.out.println("source file not exixt");
27    }
28   if(!encFile.exists()) {
29    System.out.println("encrypt file created");
30    encFile.createNewFile();//若無加密檔案,新建一個加密檔案
31   }
32   InputStream fis=new FileInputStream(srcFile);
33   OutputStream fos=new FileOutputStream(encFile);
34   
35   while((dataOfFile=fis.read())>-1) {//當讀到檔案內容時
36    fos.write(dataOfFile^numOfEncAndDec);//將讀出的內容加密後寫入
37   }
38   fis.close();
39   fos.flush();
40   fos.close();
41  }
42  private static void DecFile(File encFile,File decFile)throws Exception{
43   if(!encFile.exists()) {
44    System.out.println("encrypt file not exixt");
45   }
46   if(!decFile.exists()) {
47    System.out.println("decrypt file created");
48    decFile.createNewFile();
49   }
50   InputStream fis=new FileInputStream(encFile);
51   OutputStream fos=new FileOutputStream(decFile);
52   
53   while((dataOfFile=fis.read())>-1) {
54    fos.write(dataOfFile^numOfEncAndDec);
55   }
56   fis.close();
57   fos.flush();
58   fos.close();
59  }
60 
61 }

3.編寫一個檔案分割工具,能把一個大檔案分割成多個小的檔案。並且能再次把它們合併起來得到完整的檔案

檔案分割:

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileNotFoundException;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 
 7 
 8 public class CutFile {
 9     public static void main(String[] args) {
10         //呼叫cutFile()函式 傳人蔘數分別為 (原大檔案,切割後存放的小檔案的路徑,切割規定的記憶體大小)
11         cutFile("D:\\file\\file.txt", "D:\\file2",1024 * 1024 * 20);
12     }
13 
14     private static void cutFile(String src, String endsrc, int num) {
15         FileInputStream fis = null;
16         File file = null;
17         try {
18             fis = new FileInputStream(src);
19             file = new File(src);
20             //建立規定大小的byte陣列
21             byte[] b = new byte[num];
22             int len = 0;
23             //name為以後的小檔案命名做準備
24             int name = 1;
25             //遍歷將大檔案讀入byte陣列中,當byte陣列讀滿後寫入對應的小檔案中
26             while ((len = fis.read(b)) != -1) {
27                 //分別找到原大檔案的檔名和檔案型別,為下面的小檔案命名做準備
28                 String name2 = file.getName();
29                 int lastIndexOf = name2.lastIndexOf(".");
30                 String substring = name2.substring(0, lastIndexOf);
31                 String substring2 = name2.substring(lastIndexOf, name2.length());
32                 FileOutputStream fos = new FileOutputStream(endsrc + "\\\\"+ substring + "-" + name + substring2);
33                 //將byte陣列寫入對應的小檔案中
34                 fos.write(b, 0, len);
35                 //結束資源
36                 fos.close();
37                 name++;
38             }
39         } catch (FileNotFoundException e) {
40             e.printStackTrace();
41         } catch (IOException e) {
42             e.printStackTrace();
43         } finally {
44             try {
45                 if (fis != null) {
46                     //結束資源
47                     fis.close();
48                 }
49             } catch (IOException e) {
50                 e.printStackTrace();
51             }
52         }
53     }
54 }

檔案集合:

 1 package class6;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 
 9 public class GotherFile {
10     public static void main(String[] args){
11         //呼叫togetherFile()函式合併小檔案到大檔案   引數列表分別為 (小檔案所在的父資料夾路徑,所合成的大檔案的路徑)
12         togetherFile("D:\\file2","D:\\file3\\file.txt");
13     }
14     private static void togetherFile(String src, String endsrc){
15         FileOutputStream fos = null;
16         File file1 = null;
17         File file2 = null;
18         try {
19             file1 = new File(endsrc);
20             file2 = new File(src);
21             //獲得大檔案的儲存路徑的FileOutputStream物件
22             fos = new FileOutputStream(endsrc);
23             //迴圈遍歷對應資料夾中的所有小檔案
24             for(File file : file2.listFiles()){
25 
26                 FileInputStream fis = new FileInputStream(file.getAbsolutePath());
27 
28                 byte[] b = new byte[1024*1024];
29                 int len = 0;
30                 //將小檔案讀入byte陣列,之後再將byte陣列寫入大檔案中
31                 while((len = fis.read(b)) != -1){
32                     fos.write(b, 0, len);
33                 }
34                 //結束資源
35                 fis.close();
36             }
37         } catch (FileNotFoundException e) {
38             e.printStackTrace();
39         } catch (IOException e) {
40             e.printStackTrace();
41         }finally{
42             try {
43                 if(fos != null){
44                     //結束資源
45                     fos.close();
46                 }
47             } catch (IOException e) {
48                 e.printStackTrace();
49             }
50         }
51     }
52 }