首页 > 其他分享 >动手动脑:文件与流

动手动脑:文件与流

时间:2022-10-24 22:14:34浏览次数:46  
标签:文件 java nio 动脑 动手 IOException file Path import

1.使用Files. walkFileTree()找出指定文件夹下所有大于指定大小(比如1M)的文件。

package com.test;
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 File implements FileVisitor<Object> {
 private final long accepted_size;
 public  File(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 = 1024;
    Path fileTree = Paths.get("D:/");
    File walk=new File(glob, size);
    EnumSet<FileVisitOption> opts=EnumSet.of(FileVisitOption.FOLLOW_LINKS);
    System.out.println("D盘中大于等于1KB的文件有");
    Files.walkFileTree(fileTree, opts, Integer.MAX_VALUE, walk);
   }
}

  

2.使用Files. walkFileTree()找出指定文件夹下所有扩展名为.txt和.java的文件。

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 FindTxtJava {

    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;
            }
        });
    }

}

  

3.使用Files. walkFileTree()找出指定文件夹下所有包容指定字符串的txt文件

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 FileGlobNIO {

    public static void main(String args[]) throws IOException {
        String glob = "glob:**/*.txt";
        String path = "D:\\wenjian";
        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.equals("account"))//若读取的内容等于“account"则输出文件名
                   {
                         System.out.println(path);
                         break;
                   }

                  }
                }
                  return FileVisitResult.CONTINUE;
            }

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

}

  

动手动脑二:

1.请通过查询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 之间的关联类。

标签:文件,java,nio,动脑,动手,IOException,file,Path,import
From: https://www.cnblogs.com/ashuai123/p/16823178.html

相关文章

  • ubuntu学习4 目录cd/pwd /passwd /man /ls /文件类型/权限 /touch / rm/mv /cp / sta
    cd :切换目录cd#回到当前用户的家目录#~可用于表示用户家目录cd/etc#切换到/etc目录cd-#切换到上一次的目录.表示当前目录..表示......
  • 解压文件时报错gzip: stdin:not in gzip format
     tar-vxfjexus-5.8.2-x64.tar.gzgzip:stdin:notingzipformattar:Childreturnedstatus1tar:Errorisnotrecoverable:exitingnow查询 原因:filejexus-......
  • CAD文件过大,使用它。100M变2M。
    先在命令栏输入   (dictremove(namedobjdict)"ACAD_DGNLINESTYLECOMP")  包含括号一起 然后输入PU进行清理。   ......
  • 删除本地文件后 Git从远程仓库重新获取不到解决办法
    一.现象当我们删除本地文件后,想从远程仓库中重新新Pull最新代码,但是执行了gitpull 命令后始终无法拉取下来,提示Alreadyup-to-date. 二.解决git强行pull并覆盖本......
  • (五)文件IO
    1标准C库IO函数标准C库跨平台方式,在不同平台下调用不同平台的API。标准C库,效率比系统IO函数更高,因为有缓冲区,降低了写磁盘的次数。根据不同的情况选择,比如对磁盘读写......
  • cstdio(cstdio头文件是什么)
    #include<cstdio>有什么用?#include<iostream>#include<cstdio>#include<algorithm>帮我解释一下这几个头文件,怎么用的很多呢。怎么跟你说啊。把最常用给你贴出来,看看吧......
  • ctime(ctime头文件的作用)
    C语言ctime()没有#include的写法,只有#include,time.h是C语言里时间的库函数。ctime在C语言里,只是一个把日期和时间转换为字符串......
  • cstdlib(头文件cstdlib)
    C++编程这个删除多于空格的程序在屏幕上可以显示了,为什么导出的?ostream_iteratoroutput(cout,"\n");istream_iteratorinput(cin);istream_iteratore;copy1(input,e,o......
  • 文件操作
    publicstaticStringfileExtendName(StringfileName){if(StringUtils.isBlank(fileName)){returnnull;}if(!fileName.contains(".")){......
  • Pycharm配置默认文件头注释和函数注释参数
    笔者使用Pycharm编辑器需要默认新增文件头的注释,再介绍Pycharm的小技巧,希望能对大家有所帮助!!!1.自动添加文件头注释文件头模板设置路径:Settings->Editor->FileandCodeT......