Java-File

File

File简述

File类是java.io包下的,代表与平台无关的文件或目录,不管是文件还是目录都是通过File来操作的。
File对于文件或目录可以完成新建、删除、重命名、查看属性等操作,但是不可以访问文件的内容,访问文件的内容必须使用IO流。

创建File实例

File类一般情况下是使用一个表示路径的字符串来创建实例。表示路径的字符串可以是绝对路劲也可以是相对路径

public static void main(String[] args) {
    //相对路径实例化File,相对路径是相对于项目的工作目录
    //可以使用System.getProperty("user.dir")获取工作目录,不要想当然地认为
    File pomFile1 = new File("pom.xml");

    //绝对路径实例化File
    //这是在windows平台下的路径字符串
    //在linux下表示路径的字符串可能是这个样子 /IdeaProject3/fileLearn/pom.xml
    File pomFile2 = new File("E:\\IdeaProject3\\filelearn\\pom.xml");

    //同样是绝对路径实例化File
    //File.separator根据不同的平台自动决定分隔符
    File pomFile3 = new File(System.getProperty("user.dir") + File.separator + "pom.xml");

    //使用File(String parent,String child)构造函数来实例化,前一个参数是父路径
    File pomFile4 = new File(System.getProperty("user.dir"), "pom.xml");

    //上面的四个File实例都表示的是同一个文件,即工作目录下的pom.xml
}

访问File路径的相关方法

面对一个File,我们常常会想要获得一些关于它路径的信息,比如:

  • 获取一个File对应的文件或目录的名字
  • 获得File对应文件所在的目录或者File对应目录的父目录
  • 对于一个使用相对路径创建的File实例,获得这个File的绝对路径
public static void main(String[] args){
    //使用相对路径来实例化一个File
    File pomFile = new File("./pom.xml");

    //获取File对应的路径字符串
    System.out.println(pomFile.getPath());// ./pom.xml
    //获取File的文件名或者目录名
    System.out.println(pomFile.getName());// pom.xml
    //获取File的文件所在目录或目录的父目录
    System.out.println(pomFile.getParent());// .
}

可以发现,这些方法在获取路径的相关信息时仅仅是根据实例化File时使用的字符串进行简单的解析而已,并不够智能。看一个比较极端的例子:

File file = new File(".");
System.out.println(file.getParent());//null

当前目录“.”的父路径居然时null,这显然不符合逻辑。
因此更稳妥一点的方法是在获取路劲信息之前首先要将File转换成绝对路径:

public static void main(String[] args){
    //使用相对路径来实例化一个File
    File pomFile = new File("./pom.xml");

    //获取File对应的路径字符串
    System.out.println(pomFile.getAbsoluteFile().getPath());// E:\IdeaProject3\filelearn\.\pom.xml
    //获取File的文件名或者目录名
    System.out.println(pomFile.getAbsoluteFile().getName());// pom.xml
    //获取File的文件所在目录或目录的父目录
    System.out.println(pomFile.getAbsoluteFile().getParent());// E:\IdeaProject3\filelearn\.
}

现在路径信息逻辑上已经不存在问题了,但是还有一个问题,就是路径信息中存在“.”,这样好像也不太好,如果想要彻底消除“.”获得一个规范的路劲字符串,那么使用另一个函数:

public static void main(String[] args) throws IOException {
    //使用相对路径来实例化一个File
    File pomFile = new File("./pom.xml");

    //获取File对应的路径字符串
    System.out.println(pomFile.getCanonicalFile().getPath());// E:\IdeaProject3\filelearn\pom.xml
    //获取File的文件名或者目录名
    System.out.println(pomFile.getCanonicalFile().getName());// pom.xml
    //获取File的文件所在目录或目录的父目录
    System.out.println(pomFile.getCanonicalFile().getParent());// E:\IdeaProject3\filelearn
}

判断File是否存在

实例化File之后并不代表这个File存在于计算机之中,可以使用下面的方法判断File是否存在以及File的类型:

public static void main(String[] args) throws IOException {
    File file = new File(".");
    String fileName = file.getCanonicalFile().getName();
    
    if(file.exists()){//判断File是否存在
        if(file.isFile()){//判断是否是文件
            System.out.println(fileName + "是一个文件");
        }else if (file.isDirectory()){//判断是否是目录
            System.out.println(fileName+"是一个目录");
        }else {
            System.out.println(fileName+"是未知文件类型");
        }
    }else {
        System.out.println(fileName+"不存在于计算机中");
    }
}

File创建文件或目录

如果File的实例化对象不存在于计算机中,那么使用File之前必须创建一个文件或者目录。但是Java并不知道这个File是文件还是目录,决定权在于用户。

创建目录

public static void main(String[] args){
    File newDir = new File("./parent/dir");
    //mkdir()创建目录,但是如果父目录不存在就会创建失败返回false
    if(!newDir.mkdir()){
        newDir.mkdirs();//mkdirs()级联创建目录包括其父目录
    }
}

创建文件

public static void main(String[] args){
    File newFile = new File("./dir/newFile");
    if(!newFile.exists()){//确定文件不存在,文件不存在才需要创建文件
        try {
            File parentDir = newFile.getCanonicalFile().getParentFile();
            //判断文件的父目录是否存在如果不存在先创建
            if(!parentDir.exists()){
                parentDir.mkdirs();
            }
            newFile.createNewFile();//创建文件
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

执行完成之后就会看到在工作目录下多了一个新文件newFile。

创建临时文件

public static void main(String[] args){
    try {
        //创建一个临时文件,临时文件保存在默认的目录
        File tempFile = File.createTempFile("pre", "tmp");
        tempFile.deleteOnExit();//设置在程序运行结束之后删除这个临时文件

        PrintStream printStream = new PrintStream(tempFile);
        printStream.println("hello tempFile\r\n");

        Scanner scanner = new Scanner(new FileInputStream(tempFile));
        String str = scanner.nextLine();
        System.out.println(str);//hello tempFile
        //虽然可以从文件中读取到字符串,但是程序执行完之后在磁盘上永远找不到这个文件
    } catch (IOException e) {
        e.printStackTrace();
    }
}

File有一个静态的方法可以创建临时文件,临时文件在程序执行结束之后就被自动删除了,所以程序运行结束之后不会再磁盘上找到这个文件。

File常见操作

现在File要么是磁盘上确实存在的文件或目录,要么就是已经被我们创建。现在就可以进行一些常见的操作了。

列出目录下所有的项

list()方法可以将目录下所有的项以字符串形式返回。
下面列出当前目录下所有的项:

public static void main(String[] args){
    File dir = new File(".");
    String[] list = dir.list();
    for(String str:list){
        System.out.println(str);
    }
    //.idea
    //dir
    //filelearn.iml
    //newFile
    //pom.xml
    //src
    //target
}

list()方法还可以传入一个过滤器,过滤掉不感兴趣的文件,例如下面的方法只列出当前目录下的目录:

public static void main(String[] args){
    File dir = new File(".");

    class CustomeFilter implements FilenameFilter{

        public boolean accept(File dir, String name) {
           if(new File(name).isDirectory()){
               return true;
           }else {
               return false;
           }
        }
    }
    String[] list = dir.list(new CustomeFilter());
    for(String str:list){
        System.out.println(str);
    }
    //.idea
    //dir
    //src
    //target
}

获取文件的最后修改时间

public static void main(String[] args){
    File file = new File("pom.xml");
    long lastModified = file.lastModified();
    Date time = new Date(lastModified);
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    System.out.println(dateFormat.format(time));
}

移动文件或目录

public static void main(String[] args){
    //dir是工作目录下的一个目录
    File file = new File("dir");
    //这个File代表新的路径
    File dest = new File("../dir");
    
    file.renameTo(dest);
}

renameTo(File dest)方法既可以移动文件也可以移动目录,即使目录中存在子目录和文件也一样可以。当然也可以使用这个方法来进行重命名。

计算文件或目录的大小

public static void main(String[] args){
    File file = new File("pom.xml");
    System.out.println(file.length());//以字节返回文件的大小
}

注意:文件的大小和文件的实际占用空间是不一样的,这是因为在存储过程中文件不是以字节为单位进行存储的,实际占用空间大小往往大于文件的大小。一般较小的文件两者差别会很大,而文件足够大的话则差别较小。
不要使用length()方法计算目录的大小,你不会获得你想要的结果。如果有这个需求需要结合listFile()方法递归计算:

public static void main(String[] args) {
    File dir = new File(".");
    try {
        System.out.println(size(dir));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

public static long size(File dir) throws FileNotFoundException {
    if(!dir.exists()) throw new FileNotFoundException();
    if(dir.isFile()){
        return dir.length();
    }
    else {
        File[] files = dir.listFiles();
        long size=0;
        for (File file:files){
            size+=size(file);
        }
        return size;
    }
}

这个方法既可以计算目录的大小也可以计算文件的大小。

删除文件或目录

delete()删除一个文件或者一个空目录,如果这个目录非空则返回false表示无法删除。
现在设计一个方法可以删除一切文件或目录包括非空目录:

public static void main(String[] args) {
    File dir = new File("./dir");
    forceDelete(dir);

}
public static void forceDelete(File file){
    if(!file.delete()){
        File[] files = file.listFiles();
        for (File f:files){
            forceDelete(f);
        }
        file.delete();
    }
}

暂时就想到这么多了,其他的以后再补充吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值