Java 文件基本技术(四):文件和目录操作

  1. JavaFile 类的理解?
    答:

    • File 既可以表示文件,也可以表示目录
    • File 构造方法中的路径参数可以是已经存在的,也可以是不存在的。可以是相对路径,也可以是绝对路径。
    • 通过 new 新建一个 File 对象,不会实际创建一个文件,只是创建一个表示文件或目录的对象
    • new 之后,File 对象中的路径是不可变的。
  2. 文件元数据相关?
    答:

    • 文件元数据主要包括文件名和路径、文件基本信息以及一些安全和权限相关的信息。
    • separatorseparatorChar 表示文件路径分隔符。在 Windows 系统中,一般为 '\'Linux 系统中一般为 '/'
    • pathSeparatorpathSeparatorChar 表示多个文件路径中的分隔符。在 Windows 系统中,一般为 ;,在 Linux 系统中,一般为 :
    • File 对象没有返回创建时间的方法,因为创建时间不是一个公共概念,Linux/Unix 就没有创建时间的概念
  3. 文件操作?
    答:

    • 文件操作主要有创建、删除、重命名。
    • 新建一个 File 对象不会实际创建文件,但方法 public boolean createNewFile() throws IOException 可以,创建成功返回 true,否则返回 false,新创建的文件内容为空。如果文件已存在,不会创建。
    • public boolean delete() 方法是删除文件或目录。要删除目录,先要删除目录下的所有子目录和文件,否则不能删除。删除成功返回 true,否则返回 false
    • public void deleteOnExit() 方法将 File 对象加入到待删列表,在 Java 虚拟机正常退出的时候进行实际删除。
    • 重命名方法 public boolean renameTo(File dest),参数 dest 代表重命名后的文件,重命名能否成功与系统有关,返回值代表是否成功
  4. 方法 public boolean mkdir() 和 方法 public boolean mkdirs() 的异同?
    答: 当 File 对象代表目录时,可以执行目录相关的操作,如创建、遍历。

    • 相同它们都是创建目录,创建成功返回 true,失败返回 false。如果目录已存在,返回值是 false
    • 不同:如果某一个中间父目录不存在,则 mkdir() 会失败,返回 false,而 mkdirs() 则会创建必需的中间父目录
  5. 【笔试题】列出当前目录下的所有扩展名为 .txt 的文件?
    答:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    File f = new File(".");
    File[] files = f.listFiles(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
    if(name.endWith(".txt")) {
    return true;
    }
    return false;
    }
    });
  1. 【笔试题】计算一个目录下的所有文件的大小(包括子目录)?
    答:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public static long sizeOfDirectory(final File directory) {
    long size = 0;
    if(directory.isFile()) {
    return directory.length();
    } else {
    for(File file : directory.listFiles()) {
    if(file.isFile()) {
    size += file.length();
    } else {
    size += sizeOfDirectory(file);
    }
    }
    return size;
    }
    }
  2. 【笔试题】在一个目录下,查找所有给定文件名的文件?
    答:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static Collection<File> findFile(final File directory, final String fileName) {
    List<File> files = new ArrayList<> ();
    for(File f : directry.listFiles()) {
    if(f.isFile() && f.getName().equals(fileName)) {
    files.add(f);
    } else if(f.isDirectory()) {
    files.addAll(findFile(f, fileName));
    }
    }
    return files;
    }
  1. 【笔试题】删除一个非空目录的方法?
    答:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public static void deleteRecursively(final File file) throws IOException {
    if(file.isFile()) {
    if(!file.delete()) {
    throw new IOException("Failed to delete " + file.getCanonicalPath());
    }
    } else if(file.isDirectory()) {
    for(File chile : file.listFiles()) {
    deleteRecursively(child);
    }
    if(!file.delete()) {
    throw new IOException("Failed to delete " + file.getCanonicalPath());
    }
    }
    }