Java中操作文件

发布于:2025-07-21 ⋅ 阅读:(12) ⋅ 点赞:(0)

前言

在上一篇文章介绍了文件的基本概念,这篇文章将介绍如何使用Java对文件进行操作。

1. 概述

文件操作可以分为两个大类。
文件系统操作:创建文件,删除文件,移动文件,获取文件属性……。
文件内容操作:读文件,写文件。

Java中通过java.io.File来对一个文件进行抽象的描述。
File类:

构造一个文件抽象实例:

    public static void main(String[] args) {
        File file = new File("D:/test/test.txt");
    }

如果使用相对路径来创建,基准路径默认为当前代码文件所在的文件夹。

2. File类的使用

File类有许多方法,但是都很好理解,下面给出部分官方文档:
在这里插入图片描述
这些大部分都十分好理解,不再一一列举,官方文档网址:
File文档

挑选部分方法在Java代码进行演示:

2.1 获取路径

    public static void main(String[] args) throws IOException {
        File file = new File("./test.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()); // 获取规范路径  规范路径指的是去除冗余的路径信息,如"."和".."等
    }

运行结果:
在这里插入图片描述

2.2 检查文件

    public static void main(String[] args) {
        File file = new File("D:/test/test.txt");
        System.out.println(file.exists()); // 检查文件是否存在
        System.out.println(file.isDirectory()); // 检查是否为目录
        System.out.println(file.isFile()); // 检查是否为文件
    }

文件存在,不是目录,是文件,输出的结果正确:
在这里插入图片描述

2.3 文件的创建删除

    public static void main(String[] args) throws IOException {
        File file = new File("./test1.txt");
//        file.createNewFile(); //文件不存在,创建文件
//        file.delete(); //删除文件
        //模拟创建和删除文件
        file.createNewFile();
        System.out.println("创建文件成功");
        file.deleteOnExit();
        System.out.println("使用deleteOnExit方法删除文件");  //程序结束时删除文件
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入任意内容以退出程序");
        scanner.next();
    }

当我们程序还在运行时,虽然已经执行到了deleteOnExit()方法,但是文件还是存在,输入任意键后,程序结束,同时也可以看到此时文件已经被删除。

2.4 查看目录

    public static void main(String[] args) {
        File file = new File("./");
        System.out.println(Arrays.toString(file.list())); // 列出文件夹下的所有文件和目录(字符符串数组)
        System.out.println(Arrays.toString(file.listFiles())); // 列出文件夹下的所有文件和目录(File数组)
    }

在实际应用中,listFiles这个方法使用的更多。
在这里插入图片描述

2.5 创建目录

    public static void main(String[] args) {
        File file = new File("./test");
        file.mkdir(); // 创建单个目录

        File file1 = new File("./test/1/2/3");
        file1.mkdirs(); // 创建多级目录
    }

如果使用mkdir()创建多级目录,代码运行后虽然不会报错,但是运行完成后并没有创建成功。

2.6 重命名

    public static void main(String[] args) throws IOException {
        File file = new File("./test.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        
        File file2 = new File("./test2.txt");
        file.renameTo(file2);
    }

这里的renameTo方法不止能改文件的名字,同时也能改目录的名字。
此外,这个方法也能起到移动文件的作用。

     public static void main(String[] args) throws IOException {
        File file = new File("./test/111.txt");
        //将文件移动到指定目录
        File file2 = new File("./111.txt");
        file.renameTo(file2);
    }

3. 读写文件操作

读文件:硬盘的数据读到内存
写文件:把内存的数据写到硬盘
我们通过“流对象”来对文件进行读写操作。
流对象可以分为两个大类:
字节流:读写数据以字节为基本单位,一次最少读写一个字节。对应的类有:InputStream,OutPutStream。读写二进制文件的时候通常使用字节流。
字符流:读写数据的时候以字符为基本的那位,一次最少读写一个字符。对应的类有:Reader,Writer。读写文本文件的时候通常使用字符流。

3.1 InputStream

这个类用于读取文件,下面看示例代码:

    public static void main(String[] args) throws IOException {
        //创建一个输入流对象,读取文件内容,这里相当于打开了一个文件
        InputStream inputStream = new FileInputStream("./test2.txt");
        //read返回的是下一个字节的整数值,范围从0到255,如果到达文件末尾,则返回-1
        while(true){
            int c = inputStream.read(); //一次读取一个字节
            if (c == -1){
                break; //如果到达文件末尾,则退出循环
            }
            System.out.printf("0x%x\n ", c); //打印字节的十六进制表示
        }
    }

运行结果是打印了这个文件每一个字节的十六进制表示:
在这里插入图片描述
还可以通过这种方法进行读取:

  byte[] bytes = new byte[1024];
  int n = inputStream.read(bytes); //一次读取多个字节

这里的返回值是实际读到的有效字节数。
在read方法的内部,往这个bytes数组中进行填充,也就是说,read会把文件中的字节存放在bytes数组中,尽可能的填满。
将上面单字节读取改进为多字节读取:

    public static void main(String[] args) throws IOException {
        //创建一个输入流对象,读取文件内容,这里相当于打开了一个文件
        InputStream inputStream = new FileInputStream("./test2.txt");
        //read返回的是下一个字节的整数值,范围从0到255,如果到达文件末尾,则返回-1
        while(true){
            byte[] bytes = new byte[1024];
            int n = inputStream.read(bytes); //一次读取多个字节

            if (n == -1){
                break; //如果到达文件末尾,则退出循环
            }
            for (int i = 0; i < n; i++) {
                System.out.printf("0x%x\n",bytes[i]);
            }
            
        }
    }

read还有三个参数的版本:
在这里插入图片描述
后两个参数表示,从off下标开始,最多填充len个,增加了灵活性,可以只使用数组的一部分,但这种在实际应用中用的不多。

在最后,我们需要使用close来关闭文件,防止内存泄漏(内存申请后没有被释放,可用内存越来越少):

inputStream.close();

3.2 OutputStream

这个则是用于在文件中写,对应InputStream的read方法,OutputStream有write方法,同样也有三个版本:
在这里插入图片描述
第一个是写一个字节,第三个是写一个字节数组,第二个是写字节数组的一个部分。

    public static void main(String[] args) {
        try(OutputStream outputStream = new FileOutputStream("./test2.txt")) {
            outputStream.write(97);
            outputStream.write(98);
            outputStream.write(99);
            outputStream.write(100);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在文件中写入abcd
在这里插入图片描述
注意,每次以这种方式打开文件,会把文件的所有内容清空。在最后加上一个“true”,就不会清空文件的内容:
在这里插入图片描述

总结

本篇文章简单介绍了文件的一些基本概念以及在java中对文件的一些常用操作,希望能够加深你们对文件的理解。


网站公告

今日签到

点亮在社区的每一天
去签到