Java 学习笔记 - IO篇:文件与目录

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 学习笔记 - IO篇:文件与目录相关的知识,希望对你有一定的参考价值。

Java 学习笔记 - IO篇:文件与目录

File 介绍

  • File 作为一个工具类,没有太多要学习的东西。把方法过一遍知道它能干啥,到于默认没有给解决方案的遍历操作,也给出了参考示例。
  1. 文件目录路径名的抽象表示形式。(所以它操作的都是对文件的描述,而不是文件内容。)
  2. 可用于文件、目录创建、删除mkdirs可创建多级目录。但默认无递归删除目录的方法。
  3. 可以获取目录内容列表,用于遍历
  4. 可以判断:存在可读可写是文件是目录可见
  5. 复制功能看参考资料
  • 另外 Java7 加了新工具类 java.nio.file.Files 对文件操作进行了增加,除了没有抢File作为文件抽象的工作。
  1. 增删改查都能做。
  2. 还能复制、移动文件。
  3. Java8时,又给它加了一个static Stream<String> lines(Path path),配合流按行读取文本非常方便(它还有一个指定字符集的重载)。

所以跟牛夫人说拜拜吧。

增删改

方法说明
boolean mkdir()创建此抽象路径名指定的目录。
boolean mkdirs()创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
boolean createNewFile()当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
static File createTempFile(String prefix, String suffix)在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
static File createTempFile(String prefix, String suffix, File directory)在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
boolean delete()删除此抽象路径名表示的文件或目录。
void deleteOnExit()在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
boolean renameTo(File dest)重新命名此抽象路径名表示的文件。
boolean setLastModified(long time)设置此抽象路径名指定的文件或目录的最后一次修改时间。

递归删除 Java7 Files

注意别写错路径啊,真的会删光的!!!

/**
 * 递归删除整个文件夹内容
 * java7 的 Files.walkFileTree + FileVisitor 实现。
 */
private static void recursionDelByFilesWalkFileTree(Path dir) throws IOException 
    Files.walkFileTree(dir, new SimpleFileVisitor<Path>() 
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException 
            file.toFile().setWritable(true); // 解决只读文件删不动的问题
            Files.delete(file);              // 删除
            return FileVisitResult.CONTINUE;
        
        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException 
            dir.toFile().setWritable(true); // 解决只读文件删不动的问题
            Files.delete(dir);              // 删除
            return FileVisitResult.CONTINUE;
        
    );

@Test
public void recursionDelTest() throws IOException 
    Path dir = Paths.get("E:\\\\jerry\\\\test\\\\temp\\\\aa\\\\bb\\\\cc\\\\dd"); // 但愿你的系统没装在这个目录下。
    recursionDelByFilesWalkFileTree(dir);

状态检测

方法说明
boolean canExecute()测试应用程序是否可以执行此抽象路径名表示的文件。
boolean canRead()测试应用程序是否可以读取此抽象路径名表示的文件。
boolean canWrite()测试应用程序是否可以修改此抽象路径名表示的文件。
boolean equals(Object obj)测试此抽象路径名与给定对象是否相等。
boolean exists()测试此抽象路径名表示的文件或目录是否存在。
boolean isAbsolute()测试此抽象路径名是否为绝对路径名。
boolean isDirectory()测试此抽象路径名表示的文件是否是一个目录。
boolean isFile()测试此抽象路径名表示的文件是否是一个标准文件。
boolean isHidden()测试此抽象路径名指定的文件是否是一个隐藏文件。

设置权限

方法说明
boolean setReadable(boolean readable)设置此抽象路径名所有者读权限的一个便捷方法。
boolean setReadable(boolean readable, boolean ownerOnly)设置此抽象路径名的所有者或所有用户的读权限。
boolean setReadOnly()标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。
boolean setWritable(boolean writable)设置此抽象路径名所有者写权限的一个便捷方法。
boolean setWritable(boolean writable, boolean ownerOnly)设置此抽象路径名的所有者或所有用户的写权限。
boolean setExecutable(boolean executable)设置此抽象路径名所有者执行权限的一个便捷方法。
boolean setExecutable(boolean executable, boolean ownerOnly)设置此抽象路径名的所有者或所有用户的执行权限。

获取文件信息

方法说明
int compareTo(File pathname)按字母顺序比较两个抽象路径名。
File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。
String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。
File getCanonicalFile()返回此抽象路径名的规范形式。
String getCanonicalPath()返回此抽象路径名的规范路径名字符串。
long getFreeSpace()返回此抽象路径名指定的分区中未分配的字节数。
String getName()返回由此抽象路径名表示的文件或目录的名称。
String getParent()返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
File getParentFile()返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
String getPath()将此抽象路径名转换为一个路径名字符串。
long getTotalSpace()返回此抽象路径名指定的分区大小。
long getUsableSpace()返回此抽象路径名指定的分区上可用于此虚拟机的字节数。
int hashCode()计算此抽象路径名的哈希码。
long lastModified()返回此抽象路径名表示的文件最后一次被修改的时间。
long length()返回由此抽象路径名表示的文件的长度。
String toString()返回此抽象路径名的路径名字符串。
URI toURI()构造一个表示此抽象路径名的 file: URI。
URL toURL()已过时。 此方法不会自动转义 URL 中的非法字符。建议新的代码使用以下方式将抽象路径名转换为 URL:首先通过 toURI 方法将其转换为 URI,然后通过 URI.toURL 方法将 URI 装换为 URL。
———————————————

遍历目录

方法说明
static File[] listRoots()列出可用的文件系统根。
String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
String[] list(FilenameFilter filter)返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
File[] listFiles(FileFilter filter)返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles(FilenameFilter filter)返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。

FilenameFilter 过滤

dir 当前被检测的目录;
name 目录or文件的名称;

@Test
public void Demo56Test() 
    String path = "E:\\\\工作文档\\\\花垣县社会服务与管理网格化平台_20211013-\\\\源码分析";
    File file = new File(path);
    File[] files = file.listFiles(new FilenameFilter() 
        @Override
        public boolean accept(File dir, String name) 
            return name.endsWith(".md"); // 获取所有 markdown 文件
        
    );
    System.out.println(Arrays.toString(files));

FileFilter过滤

pathname 抽象路径名

@Test
public void Demo60Test() 
    String path = "E:\\\\工作文档\\\\花垣县社会服务与管理网格化平台_20211013-\\\\源码分析";
    File file = new File(path);
    File[] files = file.listFiles(new FileFilter() 
        @Override
        public boolean accept(File file) 
            if (file.isFile()) 
                return file.getName().endsWith(".md");
            
            return true;
        
    );
    System.out.println(Arrays.toString(files));

参考资料

笑虾:Java 学习笔记 - IO篇:复制文件
笑虾:Java 学习笔记 - Spring工具类:FileCopyUtils、StreamUtils

java.io.File
Interface FileFilter
Interface FilenameFilter

以上是关于Java 学习笔记 - IO篇:文件与目录的主要内容,如果未能解决你的问题,请参考以下文章

Java 学习笔记 - IO篇:读写文本文件txt

Java学习笔记七(目录操作)

Java 学习笔记 - IO篇:对象流 ObjectInputStreamObjectOutputStream

Java 学习笔记 - IO篇:对象流 ObjectInputStreamObjectOutputStream

Java 学习笔记 - IO篇:常见的IO流Stream以及相互关系

Java 学习笔记 - IO篇:常见的流Stream通道Channl以及相互关系