zoukankan      html  css  js  c++  java
  • 动手动脑-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. 监控完毕,关掉监视服务。
     
     
  • 相关阅读:
    请多指教
    第九周作业总结
    win10系统开机输入密码黑屏解决方法
    第八周作业总结
    第七周作业总结
    第六周作业总结
    第五周作业总结
    第四周作业
    第三周作业
    2019年春季学期第二周作业
  • 原文地址:https://www.cnblogs.com/zhaoxinhui/p/9980002.html
Copyright © 2011-2022 走看看