Java SE: 一文彻底搞懂File类

简介: Java SE: 一文彻底搞懂File类

编译软件:IntelliJ IDEA 2019.2.4 x64

运行环境:win10 家庭中文版

jdk版本:1.8.0_361

提示:以下是本篇文章正文内容,下面案例可供参考

一、File类是什么?

说到File,也许有人会想到是在windows电脑中被我们熟练使用的众多文件,如word文件,ppt文件等;也许是mac笔记本下的众多文件。但在Java编程语言中,它却并不代表文件本身。

File类是java.io包下代表与平台无关的文件和目录,也就是说如果希望在程序中操作文件和目录都可以通过File类来完成,也可以跨平台使用File。File类可以新建文件、删除文件、重命名文件和目录等。

在API中File的解释是文件和目录路径名的抽象表示形式,即File类是文件或目录的路径,而不是文件本身 ,因此我们在使用File类的时候,并不能直接访问文件内容它本身,如果需要访问文件内容本身,则需要使用输入/输出流。

例如:要表示Windows操作系统下的C盘桌面下的《打穿西游的唐僧》.txt,可以这样表示:File file=new File(“C:\Users\king\Desktop\《打穿西游的唐僧》.txt”);

二、构造方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
    代码如下(示例):
@Test
    public void  test21(){
        // 文件路径名
        String pathname="C:\\Users\\king\\Desktop\\《打穿西游的唐僧》.txt";
        File file=new File(pathname);
    }
  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
    代码如下(示例):
@Test
    public void test22(){
        // 通过父路径和子路径字符串
        String parent = "C:\\Users\\king\\Desktop";
        String child = "《打穿西游的唐僧》.txt";
        File file3 = new File(parent, child);
    }
  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
    代码如下(示例):
@Test
 public void test23(){
    // 通过父级File对象和子路径字符串
        File parentDir = new File("C:\\Users\\king\\Desktop");
        String childFile = "《打穿西游的唐僧》.txt";
        File file4 = new File(parentDir, childFile);
}

🔔注意

  • 一个File对象代表硬盘或网络中可能存在的一个文件或目录。
  • 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
  • 如果File对象代表的文件或目录存在,则File对象实例初始化时,就会用硬盘中对应文件或目录的属性信息(例如,时间、类型等)为File对象的属性赋值,否则除了路径和名称,File对象的其他属性将会保留默认值。

三、常用方法

3.1 获取文件和目录基本信息

  • public String getName() : 返回由此File表示的文件或目录的名称。
  • public Long length() : 返回由此File表小的文件的长度。

案例需求:求D:\Test下所有的文件大小

代码如下(示例):

@Test
    public void test07(){
        //求D:\Test下所有的文件大小
        File dir=new File("D:\\Test");
//        System.out.println((getFileSize(dir))+"字节");
        System.out.println(getFileLength(dir));
    }
  public long getFileLength(File dir){
        long sum=0;
        if (dir.isFile()){
            sum+=dir.length();
        }else if (dir.isDirectory()){
            File[] files = dir.listFiles();
            for (File sub : files) {
                sum+=getFileLength(sub);
            }
        }
        return sum;
    }

  • public String getPath() : 将此File转换为路径名字符串。
  • public long lastModified(): 返回Fle对象对应的文件或目录的最后修改时间(毫秒值)
    代码如下(示例):
@Test
    public void test02(){
        File file1=new File("C:\\\\Users\\\\king\\\\Desktop\\\\《打穿西游的唐僧》.txt");
        System.out.println(file1.getName());//文件名
        System.out.println(file1.length());//文件大小
        System.out.println(file1.getPath());//文件的路径
        long time=file1.lastModified();//文件的最后修改时间(毫秒值)
        Date date=new Date(time);
        System.out.println(date);
    }

🔔注意

💡小tips: 如果文件类对象是一个目录,它使用length()方法得到的文件大小是不准确的

不信?请看如下代码演示:

@Test
    public void test03(){
        //以文件夹举例
        File file1=new File("C:\\Users\\king\\Desktop\\桌面清理");
        System.out.println(file1.getName());
        System.out.println(file1.length());
        System.out.println(file1.getPath());//4096
        long time=file1.lastModified();
        Date date=new Date(time);
        System.out.println(date);
    }

😖 API中的解释:

public long length() :返回由此抽象路径名表示的文件的长度。

如果此路径名表示一个目录,则返回值是不确定的。

3.2 判断功能

  • public boolean exists():此File表示的文件或目录是否实际存在。
  • public boolean isDirectory() :此File表示的是否为目录。
  • public boolean isFile() :此File表示的是否为文件。
    代码如下(示例):
@Test
    public void test06() throws IOException{
        File f = new File("C:\\Users\\king\\Desktop\\《打穿西游的唐僧》.txt");
        File f2 = new File("C:\\Users\\king\\Desktop");
        // 判断是否存在
        System.out.println("C:\\Users\\king\\Desktop\\《打穿西游的唐僧》.txt 是否存在:"+f.exists());
        System.out.println("C:\\Users\\king\\Desktop 是否存在:"+f2.exists());
        // 判断是文件还是目录
        System.out.println("C:\\Users\\king\\Desktop 文件?:"+f2.isFile());
        System.out.println("C:\\Users\\king\\Desktop 目录?:"+f2.isDirectory());
    }

3.2 创建 or 删除文件/目录

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
  • public boolean delete() :删除由此File表示的文件或目录。 只能删除空目录。
  • public boolean mkdir() :创建由此File表示的目录。
  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
    代码如下(示例):
@Test
    public void test07() throws IOException{
        // 文件的创建
        File f = new File("a.txt");
        System.out.println("a.txt是否存在:"+f.exists());
        System.out.println("a.txt是否创建:"+f.createNewFile());
        System.out.println("a.txt是否存在:"+f.exists());
        // 目录的创建
        File f2= new File("myDir");
        System.out.println("myDir是否存在:"+f2.exists());
        System.out.println("myDir是否创建:"+f2.mkdir());
        System.out.println("myDir是否存在:"+f2.exists());
        // 创建一级目录
        File f3= new File("myDir_a\\myDir1");
        System.out.println("myDir_a\\myDir1创建:" + f3.mkdir());//myDir_a\myDir1创建:false  mkdir()如果要创建若父目录不存在的子目录的话,必然失败
        File f4= new File("myDir_a\\myDir2");
        System.out.println("myDir_a\\myDir2创建:" + f4.mkdir());//myDir_a\myDir2创建:false mkdir()如果要创建若父目录不存在的子目录的话,必然失败
        // 创建多级目录
        File f5= new File("myDir_a\\myDirs");
        System.out.println("myDir_a\\myDirs创建:" + f5.mkdirs());//myDir_a\myDirs创建:true  mkdirs()可以创建任何必需但不存在的父目录。
        // 文件的删除
        System.out.println("a.txt删除:" + f.delete());//a.txt删除:true
        // 目录的删除
        System.out.println("myDir删除:" + f2.delete());//myDir删除:true  myDir是空目录
        System.out.println("myDira\\myDir2删除:" + f4.delete());//myDira\myDir2删除:false  delete()只能删除空目录
    }

案例:递归删除非空文件夹

@Test
public void test08(){
    //递归删除非空文件夹
    File dir=new File("D:\\Test - 副本");
    recursiveDeleteDirctor(dir); //此删除是不是放到回收站,而是真删除,直接干掉
}
public void recursiveDeleteDirctor(File dir){
    if (dir.isDirectory()){
        File[] files = dir.listFiles();
        for (File sub : files) {
            recursiveDeleteDirctor(sub);
        }
    }
    dir.delete();
}

3.3 列出目录的下一级

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
    代码如下(示例):
@Test
    public void test08() throws IOException{
        //C:\Users\king\Desktop目录中的所有子文件或目录
        File dir=new File("C:\\Users\\king\\Desktop");
        String[] list = dir.list();
        for (String s : list) {
            System.out.println(s);
        }
    }

  • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
    代码如下(示例):
@Test
    public void test09() throws IOException{
        //C:\Users\king\Desktop目录中的所有子文件或目录
        File dir=new File("C:\\Users\\king\\Desktop");
        File[] files = dir.listFiles();
        for (File file : files) {
            System.out.println(file.getName());
        }
    }

  • public File[] listFiles(FileFilter filter):**返回所有满足指定过滤器的文件和目录。**如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(File pathname)方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。
  • public String[] list(FilenameFilter filter)返回返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FilenameFilter .accept(File dir, String name)方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。
  • public File[] listFiles(FilenameFilter filter)返回返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FilenameFilter .accept(File dir, String name)方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。
    案例:获取D:\Test下所有的.jpg图片
    代码如下(示例):
@Test
    public void test06(){
        //获取D:\Test下所有的.jpg图片
        File dir=new File("D:\\Test");
        getJpgImage(dir);
    }
  public void getJpgImage(File dir){
      if (dir.isDirectory()){
      File[] files = dir.listFiles(new FileFilter() {
        @Override
        //   返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
        public boolean accept(File pathname) {
            return pathname.getName().endsWith(".jpg") || pathname.isDirectory();
        }
    });
    for (File sub : files) {
        if (sub.isDirectory()){
            getJpgImage(sub);
        }else {
            System.out.println(sub);
        }
    }
}
}


四、路径问题

File类可以使用文件路径字符串来创建File实例,该文件路径字符串既可以是绝对路径,也可以是相对路径.

默认情况下,系统总是依据用户的工作路径来解释相对路径,这个路径由系统属性“user.dir"指定,通常也就是运行lava虚拟机时所作的路径。

常用方法

  • public String getPath() :将此File转换为路径名字符串。
  • public String getAbsolutePath() :返回此File的绝对路径名字符串。
  • String getCanonicalPath():返回此File对象所对应的规范路径名。
  • 绝对路径: 在描述文件或文件夹时,从根目录开始导航的路径

对于windows操作系统来说,盘符就是根 : d:/Download d:/Download/1.txt

对于Linux操作系统来说,/就是根: /Download

代码如下(示例):

@Test
    public void test1() throws IOException {
        File f1 = new File("C:\\Users\\king\\Desktop\\《打穿西游的唐僧》.txt"); //绝对路径
        System.out.println("文件/目录的名称:" + f1.getName());
        System.out.println("文件/目录的构造路径名:" + f1.getPath());
        System.out.println("文件/目录的绝对路径名:" + f1.getAbsolutePath());
        System.out.println("文件/目录的规范路径名:" + f1.getCanonicalPath());
        System.out.println("文件/目录的父目录名:" + f1.getParent());
    }

@Test
    public void test04()throws IOException{
        File f2 = new File("/HelloIO.java");//绝对路径,从根路径开始
        System.out.println("文件/目录的名称:" + f2.getName());
        System.out.println("文件/目录的构造路径名:" + f2.getPath());
        System.out.println("文件/目录的绝对路径名:" + f2.getAbsolutePath());
        System.out.println("文件/目录的规范路径名:" + f2.getCanonicalPath());
        System.out.println("文件/目录的父目录名:" + f2.getParent());
    }

  • 相对路径:在描述文件或文件夹时,不是从根目录开始导航的路径

例如: download/1.txt 相对谁呢?

相当于在IDEA中,JUnit的test 方法,相对路径是相于当前的模块

@Test
    public void test05() throws IOException {
        File f3 = new File("HelloIO.java");//相对路径
        System.out.println("user.dir =" + System.getProperty("user.dir"));//System.getProperty:获取系统属性
        System.out.println("文件/目录的名称:" + f3.getName());
        System.out.println("文件/目录的构造路径名:" + f3.getPath());
        System.out.println("文件/目录的绝对路径名:" + f3.getAbsolutePath());
        System.out.println("文件/目录的规范路径名:" + f3.getCanonicalPath());
        System.out.println("文件/目录的父目录名:" + f3.getParent());
    }

  • 构造路径:在new File对象时,在()中填写的路径。

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

-规范路径:所谓规范路径名,即对路径中的“…”等进行解析后的路径名

💡小tips:

  • 当构造路径是绝对路径时,那么getPath和getAbsolutePath结果一样
  • 当构造路径是相对路径时,那么getAbsolutePath的路径 = user.dir的路径 + 构造路径
  • 路径中如果出现“…”表示上一级目录,路径名如果以“/”开头,表示从“根目录”下开始导航。
相关文章
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
176 57
|
30天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
81 8
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
149 4
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
99 2
|
2月前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
36 0
|
5月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
70 7
|
3月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
53 3
|
3月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
55 2

热门文章

最新文章