• JAVA I/O系统 Thinking in Java 之 File类


      File类的文件具有一定的误导性,我们可能会认为它指代的是文件,实际上并非如此。它技能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。如果它指的是一个文件集,我们就可以对此集合调用list()方法,从而获取一个目录下的所有文件名称。实际上,FilePath是一个更好的名字。

      1.目录列表器

      这里尝试获取一个目录下的全部文件和部分文件,首先获取目录下所有的文件名称。

      public static void main(String[] args) {

      String filePath = "D:\file\imgs\order";

      File file = new File(filePath);

      String[] list = file.list();

      //打印该目录下所有的文件

      System.out.println(Arrays.toString(list));

      }

      控制台:

      [2dbbd28c3f3b4d3b591557fec3e6a528.png, abc.png, adbc.jpg, afa409b3e0db9edd5f5f91ccb4781546.png, asd.jpeg, b121502f8ed9346f9ee1236e5a1f7ab4.png, b121502f8ed9346f9ee1236e5a1f7ab4.png.webp]

      然后我们尝试获取该目录下所有的png文件。

      String[] list1 = file.list(new FilenameFilter() {

      private Pattern pattern = Pattern.compile(".*\.png");

      @Override

      public boolean accept(File dir, String name) {

      return pattern.matcher(name).matches();

      }

      });

      System.out.println(Arrays.toString(list1));

      控制台:

      [2dbbd28c3f3b4d3b591557fec3e6a528.png, abc.png, afa409b3e0db9edd5f5f91ccb4781546.png, b121502f8ed9346f9ee1236e5a1f7ab4.png]

      此处用到了接口FilenameFilter,该接口的定义十分简单,内部只有一个accecpt方法,我们可以使用匿名内部类自定义实现过滤方法。

      2.目录实用工具

      目录遍历器Driectory和格式化打印器PPrint。原理还是利用过滤接口FilenameFilter+正则Pattern来实习,使用Directory可以遍历某个目录下所有的符合正则表达式的文件。

      Driectory。

      /*

      * Copyright (c) 2019. 唐江华 保留所有权。

      */

      package com.io.fileClass;

      import java.io.File;

      import java.io.FilenameFilter;

      import java.util.ArrayList;

      import java.util.Iterator;

      import java.util.List;

      import java.util.regex.Pattern;

      /**

      * @author tangjianghua

      * @data @data

      */

      public final class Driectory {

      /**

      * 匹配dir下符合reg的所有文件,并返回文件数组

      * @param dir

      * @param reg

      * @return File[]

      */

      public static File[] local(File dir,final String reg){

      return dir.listFiles(new FilenameFilter() {

      private Pattern p = Pattern.compile(reg);

      @Override

      public boolean accept(File dir, String name) {

      return p.matcher(name).matches();

      }

      });

      }

      /**

      * 匹配path下符合reg的所有文件,并返回文件数组

      * @param path

      * @param reg

      * @return File[]

      */

      public static File[] local(String path,final String reg){

      return local(new File(path),reg);

      }

      /**

      * 匿名内部类TreeInfo

      * 用来封装每级目录和文件

      */

      public static class TreeInfo implements Iterable{

      public List files = new ArrayList();

      public List dirs = new ArrayList();

      @Override

      public Iterator iterator() {

      return files.iterator();

      }

      //添加另一个对象的元素

      void addAll(TreeInfo other){

      files.addAll(other.files);

      dirs.addAll(other.dirs);

      }

      @Override

      public String toString() {

      // 使用工具PPrint打印

      return "dirs: " +PPrint.pformat(dirs)+" files: "+PPrint.pformat(files);

      }

      }

      public static TreeInfo walk(String start ,String reg){

      return recurseDirs(new File(start), reg);

      }

      public static TreeInfo walk(File start ,String reg){

      return recurseDirs( start , reg);

      }

      public static TreeInfo walk(String start){

      return recurseDirs(new File(start), ".*");

      }

      public static TreeInfo walk(File start){

      return recurseDirs( start , ".*");

      }

      /**

      * 从其实目录startDir开始遍历获取所有的目录和文件

      * @param startDir

      * @param reg

      * @return TreeInfo

      */

      static TreeInfo recurseDirs(File startDir ,String reg){

      TreeInfo result = new TreeInfo();

      for (File item : startDir.listFiles()) {

      if (item.isDirectory()) {

      //如果是目录,则添加目录并递归

      result.dirs.add(item);

      result.addAll(recurseDirs(item,reg));

      }else {

      // 过滤文件

      if (startDir.getName().matches(reg)) {

      result.files.add(item);

      }

      }

      }

      return result;

      }

      public static void main(String[] args) {

      if(args.length == 0){

      //如果参数长度为0,则walk当前目录

      System.out.println(walk("."));

      }else{

      for (String arg: args){

      System.out.println(walk(arg));

      }

      }

      }

      }

      PPrint。

      /*

      * Copyright (c) 2019. 唐江华 保留所有权。

      */

      package com.io.fileClass;

      import java.util.Arrays;

      import java.util.Collection;

      /**

      * @author tangjianghua

      * @data @data

      */

      public class PPrint {

      public static String pformat(Collection c){

      if (c.size() == 0) {

      return "[]";

      }

      StringBuilder result = new StringBuilder("[");

      for (Object elem : c) {

      if (c.size() != 1) {

      result.append(" ");

      }

      result.append(elem);

      }

      if (c.size() != 1) {

      result.append(" ");

      }

      result.append("]");

      return result.toString();

      }

      public static void pprint(Collection c){

      System.out.println(pformat(c));

      }郑州较好的妇科医院 http://www.kd0371.com/

      public static void pprint(Object[] c){

      System.out.println(Arrays.asList(c));

      }

      }

      3.目录的检查及创建

      这一小结来认识File有哪些方法,可以帮助我们做什么。

      package com.io.fileClass;

      import java.io.File;

      import java.io.IOException;

      import java.util.Date;

      /**

      * @author tangjianghua

      * @data @data

      */

      public class MakeDirectories {

      public static void main(String[] args) throws IOException{

      String path = "D:/test/child/test.txt";

      File file = new File(path);

      System.out.println("File存不存在:"+file.exists());

      System.out.println("File如果不存在我们创建它的父级目录:"+file.mkdirs());

      // System.out.println("File如果不存在我们创建它:"+file.mkdir());

      System.out.println("File如果不存在我们创建它:"+file.createNewFile());

      System.out.println("File是路径吗:"+ file.isDirectory());

      System.out.println("File是文件吗:"+ file.isFile());

      System.out.println("File的父级目录:"+file.getParent());

      System.out.println("File的绝对路径:"+file.getAbsolutePath());

      System.out.println("File的规范路径:"+file.getCanonicalPath());

      System.out.println("File的路径:"+file.getPath());

      System.out.println("File是否可读:"+file.canRead());

      System.out.println("File是否可写:"+file.canWrite());

      System.out.println("File是否可执行:"+file.canExecute());

      System.out.println("File是否是绝对的:"+file.isAbsolute());

      System.out.println("File是否被隐藏:"+file.isHidden());

      System.out.println("File的名称:"+file.getName());

      System.out.println("File最后一次修改时间:"+ new Date(file.lastModified()));

      //File如果存在则删除:

      file.deleteOnExit();

      }

      }

  • 相关阅读:
    29
    28
    27
    950. 按递增顺序显示卡牌
    25
    20190624
    409. 最长回文串
    636. 函数的独占时间
    LeetCode 1046. 最后一块石头的重量(1046. Last Stone Weight) 50
    LeetCode 942. 增减字符串匹配(DI String Match) 49
  • 原文地址:https://www.cnblogs.com/djw12333/p/12029010.html
Copyright © 2020-2023  润新知