动手动脑-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.34\apache-tomcat-8.5.34\webapps\examples\WEB-INF\classes\compressionFilters\CompressionServletResponseWrapper.java
D:\apache-tomcat-8.5.34\apache-tomcat-8.5.34\webapps\examples\WEB-INF\classes\CookieExample.java
D:\apache-tomcat-8.5.34\apache-tomcat-8.5.34\webapps\examples\WEB-INF\classes\dates\JspCalendar.java
D:\apache-tomcat-8.5.34\apache-tomcat-8.5.34\webapps\examples\WEB-INF\classes\error\Smart.java
D:\apache-tomcat-8.5.34\apache-tomcat-8.5.34\webapps\examples\WEB-INF\classes\examples\ExampleTagBase.java
D:\apache-tomcat-8.5.34\apache-tomcat-8.5.34\webapps\examples\WEB-INF\classes\examples\FooTag.java
D:\apache-tomcat-8.5.34\apache-tomcat-8.5.34\webapps\examples\WEB-INF\classes\examples\FooTagExtraInfo.java
D:\apache-tomcat-8.5.34\apache-tomcat-8.5.34\webapps\examples\WEB-INF\classes\examples\LogTag.java
D:\apache-tomcat-8.5.34\apache-tomcat-8.5.34\webapps\examples\WEB-INF\classes\examples\ShowSource.java
........
D:\apache-tomcat-8.5.34\apache-tomcat-8.5.34\webapps\ROOT\RELEASE-NOTES.txt
D:\apple.txt
D:\Corel VideoStudio Pro X7\en-US\Ulead.dat\AboutData\Loc\Copyright.txt
D:\Corel VideoStudio Pro X7\en-US\Ulead.dat\AboutData\Loc\Licence.txt
D:\Corel VideoStudio Pro X7\en-US\Ulead.dat\AboutData\Loc\SerialStringFormat.txt
D:\Corel VideoStudio Pro X7\en-US\Ulead.dat\AboutData\Loc\ThirdCopyright_PG.txt
D:\Corel VideoStudio Pro X7\en-US\Ulead.dat\AboutData\Loc\ThirdCopyright_PJ.txt
D:\Corel VideoStudio Pro X7\en-US\Ulead.dat\AboutData\Loc\ThirdCopyright_Ut.txt
D:\Corel VideoStudio Pro X7\en-US\Ulead.dat\AboutData\Loc\Warning.txt
D:\Corel VideoStudio Pro X7\en-US\Ulead.dat\AboutData\Loc\WWWHints.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.47\src\testsuite\ssl-test-certs\certs_howto.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hbl51c40.ghg\~IC\ItemTemplates\FSharp\General\1028\textfile.zip\TextFile.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hbl51c40.ghg\~IC\ItemTemplates\FSharp\General\1029\textfile.zip\TextFile.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hbl51c40.ghg\~IC\ItemTemplates\FSharp\General\1031\textfile.zip\TextFile.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hbl51c40.ghg\~IC\ItemTemplates\FSharp\General\1033\textfile.zip\TextFile.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hbl51c40.ghg\~IC\ItemTemplates\FSharp\General\1036\textfile.zip\TextFile.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hbl51c40.ghg\~IC\ItemTemplates\FSharp\General\1040\textfile.zip\TextFile.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCWizards\AppWiz\MFC\Application\templates\2052\handler_readme.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCWizards\AppWiz\MFC\Application\templates\2052\readme.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCWizards\AppWiz\MFC\Application\templates\3082\handler_readme.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCWizards\AppWiz\MFC\Application\templates\3082\readme.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCWizards\AppWiz\MFC\Control\templates\2052\readme.txt
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCWizards\AppWiz\MFC\Library\templates\2052\readme.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 对象注册监视服务。
实现文件变更监视服务步骤:
- 创建 WatchService 的一个实例变量 "watcher"。
- 使用 watcher 注册每一个想要监视的目录。注册目录到监视服务时,需要指定想要接收文件更改通知的事件类型。注册目录会返回一个 WatchKey 实例 key。
- 执行一个无限循环来监控要到来的事件。当一个事件发生时,对实例 key 发出信号通知并且将它放到 watcher 的队列中。
- 从 watcher 的队列中重新得到 key 实例。Key 实例包含发生变更的文件名。
- 从 key 实例中得到挂起的事件,然后根据需要对这些事件进行处理。
- 重置 key 实例并重新开始监控事件。
- 监控完毕,关掉监视服务。