详解java中File的用法

         Java通过java.io.File类来操作文件(或者是目录),也就是说通过File类创建的对象可以表示一个文件,也可以表示一个目录.

File概述

一.构造方法

1. File(File parent, String child)
说明:根据父目录和孩子文件路径,来创建File实例
2. File(String pathname)
说明:根据文件路径来创建File实例,文件路径可以是绝对路径或者是相对路径
3. File(String parent, String child)
说明:根据父目录路径和孩子文件路径,创建File实例

假设,我们现在的java项目路径是E:/test/fzu,这个项目下有一个txt文件,它的路径是E:/test/fzu/pzn.txt,那我们可以依据这个路径,通过上面三种方式来创建一个File对象

通过第一种方式创建File对象,代码如下

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) {
        File parentDir = new File("E:/test/fzu");
        File targetFile = new File(parentDir,"pzn.txt");
        System.out.println(targetFile.exists());
    }
}

或者

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) {
        File parentDir = new File("E:/test");
        File targetFile = new File(parentDir,"fzu/pzn.txt");
        System.out.println(targetFile.exists());
    }
}

第一种方法通过父目录和孩子文件路径来创建File对象

这里父目录和孩子文件路径是相对的,对于E:/test/fzu/pzn.txt这个路径,

你可以认为E:/test/fzu是父目录,也可以认为E:/test是父目录,只要根据不同的父目录后面对应好相对的孩子文件路径即可

通过第二种方式创建File对象,代码如下

import java.io.File;
import java.io.IOException;
public class Test { 
    public static void main(String[] args) throws IOException {
        File targetFile = new File("E:/test/fzu/pzn.txt");
        System.out.println(targetFile.exists());
    }
}

第二种方法通过文件的绝对路径或者相对路径来创建File对象,绝对路径即是E:/test/fzu/pzn.txt

而对于相对路径,这里的相对是针对项目路径的,也就是说如果你想要用相对路径来创建File对象,应该保证该文件在项目路径上的,而pzn.txt文件正是在项目路径e:/test/fzu下

那么我就可以直接通过相对路径来创建,代码如下

import java.io.File;
import java.io.IOException;
public class Test {
    public static void main(String[] args) throws IOException {
        File targetFile = new File("pzn.txt");
        System.out.println(targetFile.exists());
    }
}

通过第三种方式创建File对象,代码如下

import java.io.File;
import java.io.IOException;
public class Test {
    public static void main(String[] args) {
        File file = new File("E:/test/fzu","pzn.txt");
        //或者
        //File file = new File("E:/test","fzu/pzn.txt");
        System.out.println(file.exists());
    }
}

第三种方式通过父目录路径和孩子文件路径来创建File对象,其实跟第一种方式相似,第一种方式先通过父目录路径来创建出父目录对象,在通过父目录对象和孩子文件路径来创建File对象,而第三种方式直接通过父目录路径和孩子文件路径创建File对象,跳过了创建父目录对象这一步

二.方法

返回值       方法名              说明
String       getParent()         返回File对象的父目录路径
String       getName()           返回File对象的文件名称
String       getPath()           返回File对象的文件路径
String       getAbsolutePath()   返回File对象的绝对路径
String       getCanonicalPath()  返回简化过的绝对路径
boolean      exists()            判断File对象是否存在
boolean      isDirectory         判断File对象是否是一个目录
boolean      isFile()            判断File对象是否是一个文件
boolean      createNewFile()     根据File对象,创建一个空文件,创建成功返回true,反之返回false
boolean      delete()            根据File对象,删除该文件,若删除成功返回true,反之返回false
void         deleteOnExit()      根据File对象,先标记该文件,直到jvm运行结束时删除该文件
String[]     list()              返回File对象代表的目录下的所有文件名
File[]       listFiles()         返回File对象代表目录下的所有文件
boolean      mkdir()             创建File对象代表的目录,成功返回true,反之返回false
boolean      mkdirs()            创建File对象代表的目录,如有必要,会创建中间目录,成功返回true
boolean      renameto(File dest) 进行文件改名,成功返回true,反之返回false
boolean      canRead()           判断用户是否对文件有可读权限
boolean      canWrite()          判断用户是否对文件有可写权限

仍然引用上面的例子,我们现在的java项目路径是E:/test/fzu,这个项目下有一个txt文件,它的路径是E:/test/fzu/pzn.txt

1.分析getParent(),getName(),getPath(),getAbsolutePath(),getCanonicalPath()

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("E:/test/fzu/pzn.txt");
        System.out.println(file.getParent());
        System.out.println(file.getName());
        System.out.println(file.getPath());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getCanonicalPath());
    }
}

运行结果如下

父目录是E:/test/fzu,文件名称是pzn.txt,这个不难理解,文件路径,绝对路径和规范路径都是E:/test/fzu/pzn.txt,那它们有什么区别呢

让我们把代码稍作修改

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("./pzn.txt");
        System.out.println(file.getParent());
        System.out.println(file.getName());
        System.out.println(file.getPath());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getCanonicalPath());
    }
}

运行结果如下

这里的.代表当前目录(..代表上一目录),也就是这里的.代表的是E:/test/fzu

./这种写法就是相对路径的写法

父目录是. ,文件名称是pzn.txt

文件路径是./pzn.txt,绝对路径是E:\test\fzu\.\pzn.txt,规范路径是E:\test\fzu\pzn.txt

可以发现当用到./这样的写法时候,绝对路径不会省略这个.,而规范路径则会将.去掉

2.分析exists(),isFile(),isDirectory()

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("pzn.txt");
        System.out.println(file.exists());
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
    }
}

运行结果如下        

​编辑

pzn.txt是个txt文件,不是目录,且它存在于项目目录下

3.分析createNewFile(),delete(),deleteOnExit()

现在我先将pzn.txt文件删除

运行如下代码

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("E:/test/fzu/pzn.txt");
        System.out.println(file.createNewFile());
    }
}

结果如下

再运行如下代码

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("E:/test/fzu/pzn.txt");
        System.out.println(file.delete());
    }
}

结果如下

可以看到通过createNewFile()我们可以依据File对象来创建一个文件,通过delete()我们则可以依据File对象删除一个文件

对于deleteOnExit(),它的作用是在jvm结束时删除文件,这里可以用多线程演示,代码如下

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("E:/test/fzu/pzn.txt");
        Thread thread = new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        file.deleteOnExit();
        thread.start();
    }
}

这段代码的效果是,在线程结束时删除pzn.txt,线程的存在时间是五秒

此时pzn.txt存在项目目录下

 

当启动程序后,等待五秒我们可以发现,pzn.txt被删除

4.分析mkdir(),mkdirs(),list(),listFiles()

现在项目目录下创建一个新目录newDir,代码如下

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("E:/test/fzu/newDir");
        System.out.println(file.mkdir());
    }
}

结果如下

在手动在newDir加p.txt,z.txt,n.txt,三个txt文件

然后调用list(),和listFiles()方法,代码如下

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("E:/test/fzu/newDir");
        String[] ret1 = file.list();
        File[] ret2 = file.listFiles();
        System.out.println(Arrays.toString(ret1));
        for (File f: ret2) {
            System.out.print(f.getName() + " ");
        }
    }
}

结果如下

对于mkdirs(),它是在给定路径中间不存在对应目录时,会手动帮你创建目录

比如我想在项目路径E:/test/fzu下创建一个目录,它的路径是E:/test/fzu/newDir1/newDir2

因为项目路径下并没有newDir1,所以就需要使用mkdirs()来创建

5.分析renameto(File dest),canRead(),canWrite()

若我想将pzn.txt改名为p.txt,代码如下

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("E:/test/fzu/pzn.txt");
        File newFile = new File("E:/test/fzu/p.txt");
        System.out.println(file.renameTo(newFile));
    }
}

项目目录下文件情况如下

运行代码结果如下

对于canRead()和canWrite(),它们是用来判断用户是否有可读和可写的权限,代码如下

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("E:/test/fzu/p.txt");
        System.out.println(file.canRead());
        System.out.println(file.canWrite());
    }
}

结果如下

结束语

文件操作不难,多写几遍,差不多就可以掌握了,因为图文的限制,有些操作不好演示,大家可以自己动手敲敲,加深理解,如果我的文章有帮助到你的话,点个赞吧

如果有什么不理解也可以跟我交流交流,发现文章有错误的话也可以向我反馈

谢谢阅读!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值