Java File,Path,Files总结

Java File 类

定义Java虚拟机的接口和类,以访问文件,文件属性和文件系统。

  1. 字段:
    File类中包含4个public静态字段,并且这4个字段比较相近:
  • pathSeparator //与系统相关的路径分隔符,返回String

  • pathSeparatorChar //与系统相关的路径分隔符,返回Char

  • separator //系统相关的默认名称分割符,返回String

  • separatorChar //系统相关的默认名称分隔符。返回Char

    由此可以看出来,这4个字段主要分为两个:pathSeparatorseparator
    区别在于:pathSeparator用于处理在多个路径下的文件分割符,比如在Windows环境变量下,每个环境变量是以;分割开来,比如:C:\test;C:\java,而在Unix中却是以:分割。因此pathSeparator可以理解为多个路径分割符。
    separator用于处理在某个路径表示的分隔符,比较明显的就是Windows是以“\”分割:比如C:\\test,而Unix以“/”分割:/home/test
    使用这两类符号表示路径,能够使编写出来的代码跨平台使用也没有什么问题。

    在Java官方文档中,标明File类是用来访问文件,文件属性和文件系统相关的,并且File类是无法访问File的具体内容的。
    下面列举下File类中比较有用的方法:

  createNewFile()     //当且仅文件不存在的时候,创建新的文件
  createTempFile(String prefix,String suffix)    //在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称

  //此方法在不用指定路径,因为默认使用的系统Temp文件夹,也就是临时文件夹,生成的文件名一般不会重复,可以看做是类似:前缀+uuid+后缀

  createTempFile(String prefix,String suffix,File directory) //在指定的路径下生成临时文件,和两个参数的区别在于不再临时Temp文件夹中生成
  delete()           //删除文件或目录
  deleteOnExit()     //在虚拟机退出的时候删除文件或目录
  getAbsolutePath()   //获取此抽象路径名的绝对形式
  getCanonicalFile()  //获取此抽象路径的名的规范形式
  getPath()           //获取此抽象路径名转换为路径名字符串。
  //getPath(),getAbsolutePath(),getCanonicalPath() 
  //三个方法分别在于使用相对路径的时候表现不同
  //Path path=new Path(".");
  //getPath();                输出 .
  //getAbsolutPath();  输出D:\test\.
  //getCanonicalPath() 输出D:\test
  //并且值得注意的是:只有getCanonicalPath()是能正确解析相对路径的,而其他方法:getPath(),getName(),getParen()等是无法解析相对路径的。

  isAbsolute()  //测试此路径是否为绝对路径
  isDirectory() //测试此路径是否是文件夹
  list()        //返回此路径下表示的目录的中的所有文件和目录
  list(FilenameFilter filter) //使用过滤器过滤文件和目录
  toURI()       //返回由此路径表示的URI
  toPath()      //返回NIO的Path对象


Path

值得注意的是在JDK1.7 中,增加了NIO Path对象,用于增强File。

值得注意的方法有:

Paths.get()                   //NIO Path的默认构造函数,注意Path默认构造函数是private的
endWith(Path other)           //路径是否是以other结束 
startWith(Path other)         //路径是否是以other开始
getName(int index)            //获取索引为index的目录或者名称(根目录不算)

//注意,和getName(index)配套的有getNameCount() ,获取元素个数,因此可以使用for循环来访问它。它还有一个迭代器方法```itertor()```,也可以使用迭代器访问。

normalize()                    //返回格式化路径,一般使用方式为调用toAbsolutePath()后调用此方法
resolve()                       //相当于拼接两个路径
resolveSibling()                //从this的父路径拼接此路径
relativize(Path other)          //返回此路径到给定路径的相对路径
toRealPath(LinkOption... options)//相当于File.getCanonicalFile() 也就是toAbsolutePath()+normalize()

值得一提的是NIO Path中新添加了一个非常有用的方法便是register(WatchService watcher, WatchEvent.Kind<?>... events),它能够注册监控文件,当文件被修改,新建,删除的时候,都能够第一时间被发现。

Demo

  public static void main(String[] args) throws IOException, InterruptedException {
          WatchService watchService = FileSystems.getDefault().newWatchService();

          String filePath = "D:/test";

          Paths.get(filePath).register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
                  StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);

          while(true){
              WatchKey key = watchService.take();
              List<WatchEvent<?>> watchEvents = key.pollEvents();
              for (WatchEvent<?> event : watchEvents) {
                  if(StandardWatchEventKinds.ENTRY_CREATE == event.kind()){
                      System.out.println("创建:[" + filePath + "/" + event.context() + "]");
                  }
                  if(StandardWatchEventKinds.ENTRY_MODIFY == event.kind()){
                      System.out.println("修改:[" + filePath + "/" + event.context() + "]");
                  }
                  if(StandardWatchEventKinds.ENTRY_DELETE == event.kind()){
                      System.out.println("删除:[" + filePath + "/" + event.context() + "]");
                  }

              }
              if(!key.reset()){
                  break;
              }
          }
      }

Files

NIO中,与Path配套使用的还有Files类,下面简单列出几个比较实用的方法:

Files.exists()               //文件是否存在
Files.createDiretory()       //创建新的文件夹
Files.copy()                 //复制一个文件到另外一个地方 
Files.copy(Path,Path,StandardCopyOption.REPLACE_EXISTING); //复制文件,当目标文件已存在的时候,覆盖目标文件
Files.move()                 //移动文件
//在之前要完成这个功能,只能使用File#rename()方法
Files.delete()               //删除文件

Files.walkFileTree() //递归遍历文件目录

一般用于查找某个指定文件。看例子:

 public static void main(String[] args)throws Exception {
        Path startingDir = Paths.get("G:\\test");
        List<Path> result = new LinkedList<>();
        Files.walkFileTree(startingDir, new FindJavaVisitor(result));
        System.out.println(result);

    }

    private static class FindJavaVisitor extends SimpleFileVisitor<Path>{
        private List<Path> result;
        FindJavaVisitor(List<Path> result){
            this.result = result;
        }
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs){
            if(file.toString().endsWith(".java")){
                result.add(file.getFileName());
            }
            return FileVisitResult.CONTINUE;
        }
    }