JavaEE:文件操作

文章目录


文件操作和IO

文件系统操作

创建文件,删除文件,创建目录,重命名...

Java中有一个类,可以帮我们完成上述操作.

这个类叫做File类.

File介绍

属性

这个表格描述了文件路径的分隔符,由于这个分隔符在不同的系统上是不一样的.我们就可以通过上面的属性来做到平台无关化.

构造方法

在这些构造方法中,我们主要来谈第二个版本File(String pathname),使用String作为路径,我们可以往里面传入绝对路径,也可以传入相对路径.也可以指定一个不存在的路径.如果传入的是一个不存在的路径,那么后续对该路径执行的操作(如创建文件或目录)会创建一个新的文件或目录。

方法

下面列出了一系列关于File的操作.

  • getParent()可以返回File对象的父目录文件路径.

  • getName()可以返回纯文件名称,也就是demo.txt

  • getPath()可以返回对象的文件路径.也就是C:\test\demo.txt

  • getAbsolutePath() 可以返回 File 对象的绝对路径

  • getCanonicalPath() 可以返回 File 对象的修饰过的绝对路径

  • exists()可以判断 File 对象描述的文件是否存在.

  • isDirectory() 判断 File 对象代表的文件是否是一个目录

  • isFile()判断 File 对象代表的文件是否是一个普通文件.

    需要注意的是,在计算机的视角下目录(文件夹)也是文件.

  • createNewFile()顾名思义,创建一个文件

  • delete()根据 File 对象,删除该文件,删除成功后返回true

  • deleteOnExit()这个删除比较特殊,它不是立即删除,而是等到程序执行结束,才删除.(稍后删除)

  • list()针对目录,返回File对象代表的目录下的所有文件名.

  • listFiles()针对目录,返回File对象代表的目录下的所有文件,以File对象表示.(相比于上一个,这个用的比较多)

  • mkdir()创建目录,只能创建一级目录.

  • mkdirs()可以递归的创建多级目录.

  • renameTo(File dest)重命名也可以视为我们平时的剪切、粘贴操作.

  • canRead()判断用户是否对文件有读权限

  • canWrite()判断用户是否对文件有写权限

代码演示

前四个
java 复制代码
package javaEE.fileIO;

import java.io.File;
import java.io.IOException;

public class D {
    public static void main(String[] args) throws IOException {
        // 由于Windows默认使用反斜杠(\)来作为文件路径的分隔符
        // 一定要使用双反斜杠来表示 \\ 
        // 我们也可以使用/来作为文件路径的分隔符,Windows也支持.
        File file = new File("C:\\test\\demo.txt");
        System.out.println(file.getParent());// 打印File对象的父目录文件路径.
        System.out.println(file.getName());// 打印纯文件名称
        System.out.println(file.getPath());// 打印对象的文件路径
        System.out.println(file.getAbsolutePath());// 打印File对象的绝对路径
        // getCanonicalPath这个会抛出IOException异常
        System.out.println(file.getCanonicalPath());// 打印File对象的修饰过的绝对路径
    }
}

此时我们发现,后三个打印出来的路径一样.

这是咋回事呢?

这主要是因为我们针对File对象进行构造的时候,就是拿绝对路径进行构造的.
File file = new File("C:\\test\\demo.txt");

如果你是绝对路径构造的,那么getPath()得到的就是绝对路径,getAbsolutePath()得到的也是绝对路径,getCanonicalPath()得到的还是绝对路径.

我们把代码中的绝对路径改成相对路径,再次运行一下.

java 复制代码
package javaEE.fileIO;

import java.io.File;
import java.io.IOException;

public class D {
    public static void main(String[] args) throws IOException {
        // 由于Windows默认使用反斜杠(\)来作为文件路径的分隔符
        // 一定要使用双反斜杠来表示 \\ . 我们也可以使用/来作为文件路径的分隔符,Windows也支持.
        File file = new File("./demo.txt");
        System.out.println(file.getParent());// 打印File对象的父目录文件路径.
        System.out.println(file.getName());// 打印纯文件名称
        System.out.println(file.getPath());// 打印对象的文件路径
        System.out.println(file.getAbsolutePath());// 打印File对象的绝对路径
        // getCanonicalPath这个会抛出IOException异常
        System.out.println(file.getCanonicalPath());// 打印File对象的修饰过的绝对路径
    }
}

我们都知道使用相对路径时,需要指定一个基准路径.那么以下代码的基准路径是谁呢?
java File file = new File("./demo.txt");

当我们通过IDEA运行程序时,基准路径就是idea打开的这个项目所在的路径.

把代码和运行结果放到一起对照一下,更容易看出区别.

关于IOException异常的触发情况:

  1. 硬盘空间不够
  2. 没有权限
list
java 复制代码
package javaEE.fileIO;

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

public class E {
    public static void main(String[] args) {
        File file = new File(".");
        // 打印当前目录下所包含的内容
        System.out.println(Arrays.toString(file.list()));
    }
}

当前目录

运行结果

直接使用list/listFiles只能看到当前目录中的内容.

如果想看到某个目录下,所有的目录和文件,就需要递归来完成.

java 复制代码
package javaEE.fileIO;

import java.io.File;


public class F {
    public static void main(String[] args) {
        File file = new File(".");
        scan(file);
    }

    private static void scan(File currentDir) {
        // 判断当前文件是不是目录
        if(!currentDir.isDirectory()) {
            // 不是目录,直接返回
            return;
        }
        // 列出目录中包含的内容
        File[] files = currentDir.listFiles();
        // 判断目录是否为空
        if(files == null || files.length == 0) {
            // 为空,直接返回
            return;
        }
        // 打印当前文件路径
        System.out.println(currentDir.getAbsolutePath());
        // 遍历整个目录
        for (File file:files) {
            if(!file.isDirectory()) {
                // 不是目录,打印出绝对路径
                System.out.println(file.getAbsolutePath());
            } else {
                //是目录,继续递归
                scan(file);
            }
        }

    }
}

运行结果

mkdir
java 复制代码
package javaEE.fileIO;

import java.io.File;

public class G {
    public static void main(String[] args) {
        File f = new File("./abc");
        boolean ok = f.mkdir();
        System.out.println(ok);
    }
}
renameTo

renameTo改名.

java 复制代码
package javaEE.fileIO;

import java.io.File;

public class H {
    public static void main(String[] args) {
        File srcFile = new File("./abc");
        File destFile = new File("./abc1234");
        boolean ok = srcFile.renameTo(destFile);
        System.out.println(ok);
    }
}

可以看到abc成功改名了.

renameTo还可以用来移动文件,跟剪切的作用很像.

java 复制代码
package javaEE.fileIO;

import java.io.File;

public class I {
    public static void main(String[] args) {
        // 将def这个文件从abc1234文件夹中,移动到当前文件夹中
        File srcFile = new File("./abc1234/def");
        File destFile = new File("./def");
        boolean ok = srcFile.renameTo(destFile);
        System.out.println(ok);
    }
}

移动文件,就是修改文件所在的路径,文件路径的修改,也可以视为是一种"重命名".

没有演示的方法都十分简单,这里就不再赘述了~

本文到这里就结束啦~

相关推荐
Kika写代码20 分钟前
【基于轻量型架构的WEB开发】课程 第14章 SSM框架整合 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis
前端·架构·java-ee
2401_853275731 小时前
Java IO 基础知识总结下
java·开发语言
我想睡到自然醒₍˄·͈༝·͈˄*₎◞ ̑1 小时前
【Android】View的解析—滑动篇
android·java
诸神黄昏EX1 小时前
Android 常用命令和工具解析之内存相关
android·java·开发语言
dreamsever1 小时前
Glide源码学习
android·java·学习·glide
武昌库里写JAVA1 小时前
SpringBoot+SpringCloud面试题整理附答案
java·开发语言·算法·spring·log4j
呼啦啦啦啦啦啦啦啦1 小时前
每日刷题(有效括号序列,滑动窗口最大值,最小的K个数,寻找第K大)
java·前端·javascript
手握风云-1 小时前
数据结构(Java版)第五期:ArrayList与顺序表(下)
java·数据结构·算法
蜗牛沐雨1 小时前
Go语言中的sync.Pool详解:高效对象复用
java·jvm·golang
不会玩技术的技术girl1 小时前
Java爬虫与淘宝API接口:深度解析销量和商品详情数据获取
java·开发语言·爬虫