动手动脑-6

package shuruliu;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class Math {
    public static void main(String args[]) throws IOException {
        String glob = "glob:**/*.{java,txt}";
        String path = "D:/";
        match(glob, path);
    }
     public static void match(String glob, String location) throws IOException {

            final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher( glob);

            Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {

                @Override
                public FileVisitResult visitFile(Path path,
                        BasicFileAttributes attrs) throws IOException {
                    if (pathMatcher.matches(path)) {
                        System.out.println(path);
                    }
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc)
                        throws IOException {
                    return FileVisitResult.CONTINUE;
                }
            });
        }

    }

这个程序的目的是寻找一个文件夹下后缀为.txt和.java的文件,我找的是D盘下的,程序运行的结果为:

D:apache-tomcat-8.5.34apache-tomcat-8.5.34webappsexamplesWEB-INFclassescompressionFiltersCompressionServletResponseWrapper.java
D:apache-tomcat-8.5.34apache-tomcat-8.5.34webappsexamplesWEB-INFclassesCookieExample.java
D:apache-tomcat-8.5.34apache-tomcat-8.5.34webappsexamplesWEB-INFclassesdatesJspCalendar.java
D:apache-tomcat-8.5.34apache-tomcat-8.5.34webappsexamplesWEB-INFclasseserrorSmart.java
D:apache-tomcat-8.5.34apache-tomcat-8.5.34webappsexamplesWEB-INFclassesexamplesExampleTagBase.java
D:apache-tomcat-8.5.34apache-tomcat-8.5.34webappsexamplesWEB-INFclassesexamplesFooTag.java
D:apache-tomcat-8.5.34apache-tomcat-8.5.34webappsexamplesWEB-INFclassesexamplesFooTagExtraInfo.java
D:apache-tomcat-8.5.34apache-tomcat-8.5.34webappsexamplesWEB-INFclassesexamplesLogTag.java
D:apache-tomcat-8.5.34apache-tomcat-8.5.34webappsexamplesWEB-INFclassesexamplesShowSource.java

........

D:apache-tomcat-8.5.34apache-tomcat-8.5.34webappsROOTRELEASE-NOTES.txt
D:apple.txt
D:Corel VideoStudio Pro X7en-USUlead.datAboutDataLocCopyright.txt
D:Corel VideoStudio Pro X7en-USUlead.datAboutDataLocLicence.txt
D:Corel VideoStudio Pro X7en-USUlead.datAboutDataLocSerialStringFormat.txt
D:Corel VideoStudio Pro X7en-USUlead.datAboutDataLocThirdCopyright_PG.txt
D:Corel VideoStudio Pro X7en-USUlead.datAboutDataLocThirdCopyright_PJ.txt
D:Corel VideoStudio Pro X7en-USUlead.datAboutDataLocThirdCopyright_Ut.txt
D:Corel VideoStudio Pro X7en-USUlead.datAboutDataLocWarning.txt
D:Corel VideoStudio Pro X7en-USUlead.datAboutDataLocWWWHints.txt

......

package shuruliu;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;
public class Search implements FileVisitor<Object> {
 private final long accepted_size;
 public Search(String glob,long accepted_size) {
      FileSystems.getDefault().getPathMatcher("glob:" +glob);
      this.accepted_size=accepted_size; 
    }
   void search(Path file) throws IOException {
    long size = (Long) Files.getAttribute(file, "basic:size");
    if(size ==accepted_size) {
     System.out.println(file);
    }
   }
   @Override
   public FileVisitResult postVisitDirectory(Object dir, IOException exc)throws IOException {
    return FileVisitResult.CONTINUE;
   }
   @Override
   public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)throws IOException {
    return FileVisitResult.CONTINUE;
   }
   @Override
   public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)throws IOException {
  search((Path) file);
     return  FileVisitResult.CONTINUE;
  }
   @Override
   public FileVisitResult visitFileFailed(Object file, IOException exc)throws IOException {
  return FileVisitResult.CONTINUE;
   }
   public static void main(String[] args) throws IOException{
    String glob= "*.jpg";
    long size = 1048576;//1M=1024k=1048576字节
    Path fileTree = Paths.get("D:/");
    Search walk=new Search(glob, size);
    EnumSet<FileVisitOption> opts=EnumSet.of(FileVisitOption.FOLLOW_LINKS);
    System.out.println("D盘中大小等于1M的文件有");
    Files.walkFileTree(fileTree, opts, Integer.MAX_VALUE, walk);
   }
}

我的这个程序结果运行不出来。还需要改进。

package shuruliu;
import java.io.IOException;
import java.io.*;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class zhao {
    public static void main(String args[]) throws IOException {
        String glob = "glob:**/*.txt";
        String path = "D://";
        match(glob, path);
    }

    public static void match(String glob, String location) throws IOException {

        final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher( glob);

        Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {

            @Override
            public FileVisitResult visitFile(Path path,
                    BasicFileAttributes attrs) throws IOException {
                if (pathMatcher.matches(path)) {
                 BufferedReader reader =Files.newBufferedReader(path);
                  String line=null;
                  while((line = reader.readLine()) !=null) {
                   if(line=="asdfghjkl")
                   {
                         System.out.println(path);
                         break;
                   }
                  }
                }
                  return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc)
                    throws IOException {
                return FileVisitResult.CONTINUE;
            }
        });
    }

}

这个程序要找出指定文件夹下所有包容指定字符串的txt文件。这个程序运行的结果为:D:mysql-connector-java-5.1.47src estsuitessl-test-certscerts_howto.txt 

D:Program Files (x86)Microsoft Visual Studio 14.0Common7IDEExtensionshbl51c40.ghg~ICItemTemplatesFSharpGeneral1028 extfile.zipTextFile.txt
D:Program Files (x86)Microsoft Visual Studio 14.0Common7IDEExtensionshbl51c40.ghg~ICItemTemplatesFSharpGeneral1029 extfile.zipTextFile.txt
D:Program Files (x86)Microsoft Visual Studio 14.0Common7IDEExtensionshbl51c40.ghg~ICItemTemplatesFSharpGeneral1031 extfile.zipTextFile.txt
D:Program Files (x86)Microsoft Visual Studio 14.0Common7IDEExtensionshbl51c40.ghg~ICItemTemplatesFSharpGeneral1033 extfile.zipTextFile.txt
D:Program Files (x86)Microsoft Visual Studio 14.0Common7IDEExtensionshbl51c40.ghg~ICItemTemplatesFSharpGeneral1036 extfile.zipTextFile.txt
D:Program Files (x86)Microsoft Visual Studio 14.0Common7IDEExtensionshbl51c40.ghg~ICItemTemplatesFSharpGeneral1040 extfile.zipTextFile.txt

D:Program Files (x86)Microsoft Visual Studio 14.0VCVCWizardsAppWizMFCApplication emplates2052handler_readme.txt
D:Program Files (x86)Microsoft Visual Studio 14.0VCVCWizardsAppWizMFCApplication emplates2052 eadme.txt
D:Program Files (x86)Microsoft Visual Studio 14.0VCVCWizardsAppWizMFCApplication emplates3082handler_readme.txt
D:Program Files (x86)Microsoft Visual Studio 14.0VCVCWizardsAppWizMFCApplication emplates3082 eadme.txt
D:Program Files (x86)Microsoft Visual Studio 14.0VCVCWizardsAppWizMFCControl emplates2052 eadme.txt
D:Program Files (x86)Microsoft Visual Studio 14.0VCVCWizardsAppWizMFCLibrary emplates2052 eadme.txt

......

package shuruliu;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.HashMap;
import java.util.Map;
public class FileWatcherDemo {
    public static void main(String[] args) {
        //创建一个WatchService对象,此对象将用于管理特定文件夹的变动信息队列。
        try(WatchService service=FileSystems.getDefault().newWatchService()) {
            //此集合可保存多个文件夹的监控信息,当前只使用了一个
            Map<WatchKey, Path> keyMap=new HashMap<>();
            Path path=Paths.get("D:\test");
            //设置WatchService对象管理的内部队列,将保存指定的文件夹的创建、删除和修改事件信息
            //返回的WatchKey对象可用于从事件队列中获取事件对象
            WatchKey key=path.register(service, StandardWatchEventKinds.ENTRY_CREATE,
                    StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY);
            keyMap.put(key, path);
            
            do {
                //开始监控,阻塞等待,当感兴趣的事件发生时,take()方法返回。
                key=service.take();
                Path eventDir=keyMap.get(key);
                //从事件队列中提取所有的事件
                for (WatchEvent<?> event : key.pollEvents()) {
                    //是什么类型的事件?
                    WatchEvent.Kind<?> kind=event.kind();
                    //是哪个对象发生了变动?
                    Path eventPath=(Path)event.context();
                    System.out.println(eventDir+":"+kind+":"+eventPath);
                }
            } while (key.reset()); //reset方法重置此对象,让其可以重新接收信息
            
        } catch (Exception e) {
            
        }

    }

}

java.nio.file.WatchService

文件系统监视服务的接口类,它的具体实现由监视服务提供者负责加载。比如在 Windows 系统上,它的实现类为 sun.nio.fs.WindowsWatchService.

java.nio.file.Watchable

实现了 java.nio.file.Watchable 的对象才能注册监视服务 WatchService。java.nio.file.Path实现了 watchable 接口,后文使用 Path 对象注册监视服务。

实现文件变更监视服务步骤:

  1. 创建 WatchService 的一个实例变量 "watcher"。
  2. 使用 watcher 注册每一个想要监视的目录。注册目录到监视服务时,需要指定想要接收文件更改通知的事件类型。注册目录会返回一个 WatchKey 实例 key。
  3. 执行一个无限循环来监控要到来的事件。当一个事件发生时,对实例 key 发出信号通知并且将它放到 watcher 的队列中。
  4. 从 watcher 的队列中重新得到 key 实例。Key 实例包含发生变更的文件名。
  5. 从 key 实例中得到挂起的事件,然后根据需要对这些事件进行处理。
  6. 重置 key 实例并重新开始监控事件。
  7. 监控完毕,关掉监视服务。
 
 
原文地址:https://www.cnblogs.com/zhaoxinhui/p/9980002.html