zoukankan      html  css  js  c++  java
  • Java

    File类

    java.io.File类,文件和目录路径名的抽象表示形式。

    Java把电脑中的文件和目录封装成一个File类,让我们可以通过File类进行文件操作。

    关键词:file、directory、path

    路径path

    • 绝对路径:是一个完整的路径

      • 以盘符(C: D:)开始的路径
        • D:IdeaProjectsIO操作 est.txt
    • 相对路径:是一个简化的路径

      • 相对是指相对于当前项目的根目录
      • D:IdeaProjectsIO操作 est.txt --> 简化: test.txt
      • 默认到根目录下寻找

    注意:

    • 路径是不分大小写的

    • window系统下,文件名分隔符用反斜杠 ,与转义符号冲突,需要用两个反斜杠\表示一个普通的反斜杠

    • D:\IdeaProjects\IO操作\test.txt

    静态变量

    Modifier and Type Field and Description
    static String pathSeparator 与系统相关的路径分隔符字符,为方便起见,表示为字符串。
    static char pathSeparatorChar 与系统相关的路径分隔符。
    static String separator 与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。
    static char separatorChar 与系统相关的默认名称分隔符。
    package file;
    
    import java.io.File;
    
    public class TestFile {
        public static void main(String[] args) {
            /*
                File 类的有关静态变量
                pathSeparator 路径分割符,不如在装jdk环境变量时,不同路径用分号隔开
                window用分号;      linux用冒号:
                separator 文件名称分割符
                window用反斜杠    linux用正斜杆/
                
             */
    
            // 原始的是char型
            System.out.println(File.pathSeparatorChar);
            System.out.println(File.separatorChar);
            // ""+原始 得到字符串型
            System.out.println(File.pathSeparator);
            System.out.println(File.separator);
    
        }
    }
    

    可知不同的操作系统路径表示是不一样的,未来的开发中,为了兼容不同系统,应该先获取separator再拼接路劲,不能把路径写死!

    构造方法

    Constructor and Description
    File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。
    File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
    File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。
    File(URI uri) 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。

    参数pathname:字符串的路径名称

    路径可以以文件结尾,也可以是文件夹结尾

    路径可以是相对路径,也可以是绝对路径

    路径可以是存在的,也可以不存在!

    创建File对象,只是把字符串路径封装成File对象,不考虑路径的真假。

    常用方法

    判断功能

    • public boolean exists() 此File表示的文件或目录是否存在。
    • public boolean isDirectory() 此File表示的文件是否为目录。
    • public boolean isFile() 此File表示的文件是否为普通文件。

    创建删除功能

    • public boolean createNewFile() 当且仅当具有该名称的文件尚不存在时,创建一个File空文件
    • public boolean delete() 删除由此File表示的文件/目录。
    • public boolean mkdir() 创建由此File表示的目录。(单级)
    • public boolean mkdirs() 创建由此File表示的目录,包括任何必需但不存在的父目录。(可多级)

    获取功能

    • public String getAbsolutePath() 返回此File的绝对路径名字符串。
    • public String getPath() 将此File转换为路径名字符串。
    • public String getName() 返回由此File表示的文件或目录的名称。
    • public long length() 返回由此File表示的文件的长度。

    目录的遍历

    • public String[] list() 返回一个String数组,表示该File目录中的所有子文件/目录
    • public File[] listFiles() 返回一个File数组,表示该File目录中的所有子文件/目录的抽象File
    package file;
    
    import java.io.File;
    
    /**
     * 通过递归打印多级目录
     */
    public class DirectoryTraversal {
        public static void main(String[] args) {
            File file = new File("aaa");
    
            getAllFile(file);
        }
    
        public static void getAllFile(File dir) {
            System.out.println(dir.getAbsolutePath());
            File[] files = dir.listFiles();
            for (File file : files) {
                if (file.isFile()) {
                    System.out.println(file.getAbsolutePath());
                } else {
                    getAllFile(file);
                }
            }
        }
    }
    文件
    

    文件搜索

    在目录遍历的基础上筛选某些类型的文件

    package file;
    
    import java.io.File;
    
    /**
     * 通过递归打印多级目录
     * 同时筛选.java文件
     */
    public class SearchFile {
        public static void main(String[] args) {
            File file = new File("D:\IdeaProjects\IO操作");
    
            getAllFile(file);
        }
    
        public static void getAllFile(File dir) {
            File[] files = dir.listFiles();
            for (File file : files) {
                if (file.isFile()) {
                    // 只打印以 .java结尾的文件
                    String name = file.getName();
                    name = name.toLowerCase();// 不区分大小写
                    if (name.endsWith(".java")) {
                        System.out.println(file.getAbsolutePath());
                    }
                } else {
                    getAllFile(file);
                }
            }
        }
    }
    
    

    只需要打印之前进行一些判断即可。

    使用过滤器进行搜索

    返回值 描述
    File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
    File[] listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。

    查看官方文档,FileFilter是一个接口,只定义了一个accept抽象方法,没有实现类!!需要自己编写实现类

    image-20200518162937825

    过滤器实现类

    package file;
    
    import java.io.File;
    import java.io.FileFilter;
    
    public class FileFilterImpl implements FileFilter {
        // 过滤标识
        private String str;
    
        public FileFilterImpl() {
            str = ".java";
        }
    
        public FileFilterImpl(String str) {
            this.str = str;
        }
    
        @Override
        public boolean accept(File pathname) {
            /*
                过滤以.java结尾的文件
                注意!如果是目录也需要返回,否则将无法递归遍历多级目录
             */
            if (pathname.isDirectory()) {
                return true;
            }
            return pathname.getName().toLowerCase().endsWith(str);
        }
    }
    

    优化后的文件搜索

    package file;
    
    import java.io.File;
    
    public class SearchFile2 {
        public static void main(String[] args) {
            File file = new File("D:\IdeaProjects\IO操作");
    
            getAllFile(file);
        }
    
        public static void getAllFile(File dir) {
            // 通过过滤器筛选 .class结尾的文件
            File[] files = dir.listFiles(new FileFilterImpl(".class"));
            for (File file : files) {
                if (file.isFile()) {
                     System.out.println(file.getAbsolutePath());
                } else {
                    getAllFile(file);
                }
            }
        }
    }
    
    

    解释

    • 优化后的代码File[] files = dir.listFiles(new FileFilterImpl(".class"));
    • dir.listFiles首先遍历dir目录下的所有子文件或目录,将它们封装成File对象
    • 然后调用参数传递的过滤器中的accept方法
    • accept的参数pathname就是之前遍历dir目录时封装的每一个File对象
    • accept返回true就将File对象添加到File[ ] 数组中,否则不加入。

    匿名内部类实现过滤器

    package file;
    
    import java.io.File;
    import java.io.FileFilter;
    
    /**
     * 使用匿名内部类实现过滤器
     */
    public class SearchFile3 {
        public static void main(String[] args) {
            File file = new File("D:\IdeaProjects\IO操作");
    
            getAllFile(file);
        }
    
        public static void getAllFile(File dir) {
            // 通过过滤器筛选 .java结尾的文件
            File[] files = dir.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
                }
            });
            for (File file : files) {
                if (file.isFile()) {
                     System.out.println(file.getAbsolutePath());
                } else {
                    getAllFile(file);
                }
            }
        }
    }
    
    

    使用lambda表达式

    package file;
    
    import java.io.File;
    import java.io.FileFilter;
    
    /**
     * 使用lambda表达式函数式接口
     */
    public class SearchFile4 {
        public static void main(String[] args) {
            File file = new File("D:\IdeaProjects\IO操作");
    
            getAllFile(file);
        }
    
        public static void getAllFile(File dir) {
            // 通过过滤器筛选 .java结尾的文件
            File[] files = dir.listFiles((File pathname)->{
                return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
            });
            for (File file : files) {
                if (file.isFile()) {
                     System.out.println(file.getAbsolutePath());
                } else {
                    getAllFile(file);
                }
            }
        }
    }
    
    

    FilenameFilter也和FlieFilter差不多

    注意一下参数的类型即可,dir是根目录,name是文件名

    package java.io;
    
    /**
     * Instances of classes that implement this interface are used to
     * filter filenames. These instances are used to filter directory
     * listings in the <code>list</code> method of class
     * <code>File</code>, and by the Abstract Window Toolkit's file
     * dialog component.
     *
     * @author  Arthur van Hoff
     * @author  Jonathan Payne
     * @see     java.awt.FileDialog#setFilenameFilter(java.io.FilenameFilter)
     * @see     java.io.File
     * @see     java.io.File#list(java.io.FilenameFilter)
     * @since   JDK1.0
     */
    @FunctionalInterface
    public interface FilenameFilter {
        /**
         * Tests if a specified file should be included in a file list.
         *
         * @param   dir    the directory in which the file was found.
         * @param   name   the name of the file.
         * @return  <code>true</code> if and only if the name should be
         * included in the file list; <code>false</code> otherwise.
         */
        boolean accept(File dir, String name);
    }
    

    lambda表示形式

    package file;
    
    import java.io.File;
    
    /**
     * 使用lambda表达式函数式接口
     */
    public class SearchFile5 {
        public static void main(String[] args) {
            File file = new File("D:\IdeaProjects\IO操作");
    
            getAllFile(file);
        }
    
        public static void getAllFile(File dir) {
            // 通过FilenameFilter过滤器筛选 .java结尾的文件
            File[] files = dir.listFiles((File d, String name)->{
                return new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java");
            });
            for (File file : files) {
                if (file.isFile()) {
                     System.out.println(file.getAbsolutePath());
                } else {
                    getAllFile(file);
                }
            }
        }
    }
    
    
    

    lambda简化

    File[] files = dir.listFiles(
        pathname->pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java")
    );
    
    
  • 相关阅读:
    ch5 对链接应用样式
    ch4 圆角框
    ch4 背景图像基础
    ch8 CSS 3列(等高文本列)
    ch8 高度相等的列--CSS方法
    ch8 faux列
    java基础 (四)之集合
    java基础 (二)之HashMap,HashTable,ConcurrentHashMap区别
    java基础 (三)之ConcurrentHashMap(10)未完待续~~~
    java基础 (一)之HashMap(jdk1.7)
  • 原文地址:https://www.cnblogs.com/1101-/p/13019408.html
Copyright © 2011-2022 走看看