Java文件操作

简介: 本文介绍了Java中`File`类的使用方法,包括构造方法、常见成员方法及其实现功能。`File`对象可以表示文件或文件夹,支持绝对路径和相对路径。构造方法有三种:基于完整路径、父级路径与子路径组合、`File`对象与字符串组合。成员方法涵盖判断类型、获取大小、获取路径、创建与删除文件/文件夹、获取文件列表、重命名等操作。文章通过示例代码详细展示了各个方法的应用场景及注意事项。

1. File的概述和构造方法

File对象表示路径,可以是文件,也可以是文件夹,这个路径可以是存在的,也可以是不存在的
绝对路径:是从文件系统的根目录开始,到指定文件或目录的完整路径,它通常包含盘符
相对路径:是相对于当前工作目录或某个已知目录的路径

首先第一个,就是传入一个完整的路径创建文件对象
第二个:父级路径就是指包含该文件或目录的上一级目录的路径
字级路径是是某个目录下的文件或子目录
例如:"E:\java\a.txt"中的父级路径就是E:\java,子路径就是后面的a.txt

下面是三种构造方法示例:

public class FileDemo1 {
    public static void main(String[] args) {
        //E:\java\a.txt
        String str = "E:\\java\\a.txt";
        //根据文件路径创建文件对象
        File f1 = new File(str);
        System.out.println(f1);
        String parent1 = "E:\\java";
        String child1 = "a.txt";
        //根据父路径和子路径创建文件对象
        File f2 = new File(parent1,child1);
        System.out.println(f2);
        //把一个File表示的路径和一个String表示的路径进行拼接
        File parent2 = new File("E:\\java");
        String child2 = "a.txt";
        File f3 = new File(parent2,child2);
        System.out.println(f3);
    }
}

2. File常见的成员方法

接下来介绍一下File中常见的成员方法的使用

2.1. 判断

public class FileDemo2 {
    public static void main(String[] args) {
        String str = "E:\\java\\a.txt";
        File f1 = new File(str);
        //判断是否是文件夹
        System.out.println(f1.isDirectory());//false
        //判断是否是文件
        System.out.println(f1.isFile());//true
        //判断是否存在
        System.out.println(f1.exists());//true
    }
}

a.txt是一个文本文件,所以在判断是否是文件夹时返回值为false,同理如果传入的路径表示一个文件夹,在判断是否是文件时就会返回false,如果传入的是一个不存在的路径,在判断是否存在时也会返回false

2.2. length()

length()方法返回的文件大小为字节

File f1 = new File("E:\\java\\a.txt");
        long len = f1.length();
        System.out.println(len);

这个是a.txt的基本信息

也正确的打印出了文件的字节大小


length()方法只能获取文件的大小,如果是一个文件夹的话就会返回0,获取文件夹的大小需要把文件夹里所有的文件大小都加到一起

2.3. getAbsoluteFile()和getPath()

getAbsoluteFile():获取绝对路径

File f1 = new File("text\\file\\FileDemo3.java");
File f2 = new File("E:\\java\\java.text\\text\\text\\file\\FileDemo3.java");
//获取绝对路径
System.out.println(f1.getAbsoluteFile());
System.out.println(f2.getAbsoluteFile());

不论创建对象时传入的是相对路径还是绝对路径,最后返回的都是绝对路径

getPath():返回定义文件时所使用的路径

File f1 = new File("text\\file\\FileDemo3.java");
        File f2 = new File("E:\\java\\java.text\\text\\text\\file\\FileDemo3.java");
        System.out.println(f1.getPath());
        System.out.println(f2.getPath());

2.4. getName()和lastModified()

getName就是获取名字,如果是文件,会获取完整的文件名,包括后缀名,如果是文件夹,也就会返回完整的文件夹的名字

File f2 = new File("text\\file\\FileDemo3.java");
        //获取文件名,(文件名+后缀)
        System.out.println(f2.getName());
        File f3 = new File("text\\file");
        //获取文件夹名
        String name = f3.getName();
        System.out.println(name);

lastModified()返回的是文件最后的修改时间,单位是毫秒,根据Date类,可以转换为想要的格式

//获取文件最后修改时间(毫秒值)
        long time = f1.lastModified();
        //将毫秒值转换成日期对象
        Date date = new Date(time);
        //将日期对象转换成yyyy-MM-dd HH:mm:ss格式
        String time1 = date.toLocaleString();
        System.out.println(time1);

3. 文件的创建和删除


在使用createNewFile时会有一个异常需要抛出处理

创建文件时,如果当前路径文件已存在,返回false,创建失败,同时,如果写入的父级路径不存在也会报错

createNewFile方法创建的一定是文件,如果路径中没有后缀,就会创建一个没有后缀的文件

public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        File f1 = new File("E:\\java\\b.txt");
        //创建文件,如果当前路径文件已存在,返回false
        //如果父级路径不存在,就会报异常
        //createNewFile方法创建的一定是文件,如果路径中没有后缀,就会创建一个没有后缀的文件
        boolean flag = f1.createNewFile();
        System.out.println(flag);//true
    }
}

mkdir()和mkdirs()都是创建文件夹的方法,前面的是创建单级文件夹,后面是创建多级文件夹,如果用mkdir去创建多级文件夹就会报错,但如果用mkdirs去创建单极文件夹也能创建成功

public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        File f2 = new File("E:\\java\\aaa");
        //创建文件夹(目录),如果与已存在文件名重名,则创建失败,也不能创建多级文件夹
        System.out.println(f2.mkdir());
        //mkdirs:创建多级文件夹(既可以创建单极文件夹又可以创建多级文件夹)
        File f3 = new File("E:\\java\\aaa\\bbb\\ccc");
        System.out.println(f3.mkdirs());
        System.out.println(f2.delete());//true
        System.out.println(f3.delete());//true
    }
}

delete方法只能删除文件和空的文件夹,并且不走回收站,彻底删除

还有一个deleteOnExit()方法,是在进程结束之后才执行删除的,根据这个特性可以应用在一些临时文件的中

4. 获取并遍历


listFiles:获取文件夹中的所有内容,把内容放在数组中返回

public class FileDemo5 {
    public static void main(String[] args) {
        File f1 = new File("E:\\HTML");
        //listFiles:获取文件夹中的所有内容,把内容放在数组中返回
        File[] files = f1.listFiles();
        for(File f:files){
            System.out.println(f);
        }
    }
}


注意:
当调用者表示的路径不存在时,返回null
当调用者表示的路径是文件时,返回null
当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组
当调用者File表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
当调用者File表示的路径是一个有隐藏文件的文件夹时,会将里面所有的文件和文件夹的路径放在数组中返回,包括隐藏文件
当调用者File表示的路径是需要权限才能访问的文件夹时,返回null

如果目录中也存在目录中的话,可以通过递归的形式遍历

public class Demo1 {
    public static void main(String[] args) {
        File f = new File("./");
        scan(f);
    }
    public static void scan(File currentDir){
        //判断是否是目录
        if(!currentDir.isDirectory()){
            return;
        }
        //列出当前目录中的内容
        File[] files = currentDir.listFiles();
        if(files == null){
            return;
        }else {
            for(File file : files){
                if(file.isFile()){
                    System.out.println(file.getAbsolutePath());
                }else {
                    //如果是目录继续递归
                    scan(file);
                }
            }
        }
    }
}


listRoots其实就是获取系统的盘符

// 列出所有的盘符
        File[] arr1 = File.listRoots();
        System.out.println(Arrays.toString(arr1));


list获取的就是当前路径下所有的文件或文件夹的名字

//list:获取当前路径下所有的内容(名字)
        File f1 = new File("E:\\java");
        String[] arr2 = f1.list();
        for (String s : arr2) {
            System.out.println(s);
        }


接下来的方法是利用文件名过滤器获取当前该路径下的所有内容

下面是一个获取文件中所有txt文件的例子:

FilenameFilter是一个函数式接口,可以通过匿名内部类的方式进行实现

File f2 = new File("E:\\java");
        //accept方法的形参:依次表示java文件夹里面每一个文件或文件夹的路径
        //参数一:父级路径
        //参数二:子级路径
        //返回值:true表示当前路径保留,false表示当前路径不保留
        String[] arr3 = f2.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                File src = new File(dir, name);
                //筛选出以txt为后缀的文件
                if (src.isFile() && name.endsWith(".txt")) {
                    return true;
                } else return false;
            }
        });
        System.out.println(Arrays.toString(arr3));

利用listFiles()也可以实现这个要求,listFiles()返回一个File对象数组,数组中的元素是File对象,这些对象代表了目录中的文件或子目录的完整路径,进而可以通过调用方法进行判断

File f3 = new File("E:\\java");
        File[] arr4 = f3.listFiles();
        for (File f : arr4) {
            if (f.isFile() && f.getName().endsWith(".txt")) {
                System.out.println(f.getName());
            }
        }

listFiles()也可以用文件名过滤器的方法来实现,

File[] arr5 = f4.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isFile() && pathname.getName().endsWith(".txt");
            }
        });
        System.out.println(Arrays.toString(arr5));
        System.out.println("--------------------");
        File[] arr6 = f4.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir, name).isFile() && name.endsWith(".txt");
            }
        });
        System.out.println(Arrays.toString(arr6));

FileFilter用于过滤File对象,使用FileFilter时已经拥有了一个File对象,因此可以直接使用该对象的属性而无需再次创建新的File对象
FilenameFilter用于过滤文件名,使用FilenameFilter时由于只获得了文件名,因此如果需要访问文件的属性(如是否是文件),则必须再次使用文件名和目录来创建新的File对象。

5. 文件重命名

通过renameTo()方法可以实现文件的重命名和移动操作

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

上面的代码就把原来名字为aaa的文件夹改为了abc

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

上面的代码实现的功能是把bbb文件夹移动到目标目录

相关文章
|
5月前
|
Java
揭秘Java文件操作背后的惊天秘密:读写、复制、删除一网打尽!
【6月更文挑战第27天】Java文件操作涵盖读、写、复制和删除。例如,读文件使用`BufferedReader`和`FileReader`;写文件利用`BufferedWriter`和`FileWriter`;复制文件通过读写流实现;删除文件则依赖`Files.delete()`。以上代码示例展示了具体实现。
38 5
|
5月前
|
Java API
Java文件操作,你的电脑“硬盘”竟然可以这样玩?!
【6月更文挑战第27天】Java文件操作涵盖创建、读取、写入、复制、删除等。`java.io`和`java.nio.file`包提供API,如`BufferedReader/FileReader`用于读取,`BufferedWriter/FileWriter`用于写入,`Files.copy()`用于复制,`Files.delete()`用于删除文件。以上代码示例展示了这些功能的简单用法。
38 1
|
6月前
|
Java API
Java的文件操作:创建、读写与删除的技术性详解
Java的文件操作:创建、读写与删除的技术性详解
48 1
|
5月前
|
安全 Java 开发者
掌握Java文件操作,让你的代码“飞”起来!读写、复制、删除全攻略!
【6月更文挑战第27天】Java文件操作涵盖读写、复制、删除。使用NIO的`Files`类提升效率:读取文件用`newBufferedReader`实现逐行读,写入文件用`newBufferedWriter`,复制文件用`copy`方法,删除文件用`deleteIfExists`,确保安全。这些最佳实践优化了内存使用,简化了代码。
37 0
|
5月前
|
监控 Java API
Java文件操作大揭秘:不只是读写,还有这些逆天技巧!
【6月更文挑战第27天】Java文件操作不仅包括基础的读写,还有NIO的文件过滤、锁定、映射以及压缩解压和文件变化监控。例如,使用Files.walk结合PathMatcher查找特定类型的文件,利用FileChannel进行文件锁定和内存映射以提升效率,借助ZipOutputStream压缩文件,以及用WatchService监听文件系统变化。这些高级技巧能提升开发效率。
32 3
|
5月前
|
Java API
惊呆了!Java文件操作竟能如此简单:一分钟学会读写、复制、删除!
【6月更文挑战第27天】Java编程中的文件操作简单易行。使用`java.io`包中的`FileInputStream`和`FileOutputStream`进行读写,例如写文件将字符串转为字节写入,读文件则循环读取字节。文件复制涉及两个流,从源文件读取后写入目标文件。删除文件只需调用`File`对象的`delete`方法。这些基本操作让Java文件处理变得直观且易于掌握。
33 1
|
5月前
|
存储 网络协议 Java
Java I/O 详解:基础、文件操作与 NIO 实践
Java I/O 详解:基础、文件操作与 NIO 实践
52 1
|
5月前
|
存储 安全 Java
Java文件操作,让你的代码更“有型”!读写、复制、删除全解析!
【6月更文挑战第27天】在Java中进行文件操作是程序基础功能之一,涉及读写、复制和删除。使用`FileReader/FileWriter`进行文本文件的读写,如示例所示,通过`try-with-resources`保证资源释放。文件复制利用`FileInputStream/FileOutputStream`,而删除文件则依赖`File`的`delete()`方法,确保条件安全执行。这些标准库类提供了高效且健壮的文件管理能力。
38 0
|
5月前
|
安全 Java API
Java文件操作:从入门到精通,读写、复制、删除一个都不能少!
【6月更文挑战第27天】在Java编程中,学习文件操作至关重要,涵盖读写、复制和删除。入门文件读写涉及读取`example.txt`内容并追加文字;进阶文件复制展示如何使用`FileInputStream`和`FileOutputStream`从`source.txt`复制到`destination.txt`;精通文件删除则利用`File`的`delete()`方法安全删除`destination.txt`,前提检查文件存在且有权限。这些实例带你全面掌握Java文件操作基础!
38 0
|
5月前
|
Java API 数据处理
Java文件操作,让你成为文件管理的王者!读写、复制、删除不在话下!
【6月更文挑战第27天】在Java编程中,掌握文件操作至关重要。使用java.io包的File和流类,可以轻松实现文件读写、复制和删除。
50 0