欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【Java】文件读写和输入输出

程序员文章站 2023-11-08 13:20:58
输入/输出流,文件流,缓冲流,对象流,文件数据IO操作...

写在前面的话:

  1. 版权声明:本文为博主原创文章,转载请注明出处!
  2. 博主是一个小菜鸟,并且非常玻璃心!如果文中有什么问题,请友好地指出来,博主查证后会进行更正,啾咪~~
  3. 每篇文章都是博主现阶段的理解,如果理解的更深入的话,博主会不定时更新文章。
  4. 本文初次更新时间:2021.01.01,最后更新时间:2021.01.01

正文开始

1. 文件操作 - File

File用来表示文件系统中的一个文件或目录。

使用 File 可以:

  1. 访问其表示的文件或目录的属性信息(名字,大小等信息)
  2. 创建或删除文件及目录
  3. 访问一个目录中的子项

但是File不能访问文件数据。

1.1 基本操作

关于File的一些基本操作:

  • String getName()
    获取文件名称
  • long length()
    获取文件长度
  • boolean canRead()
    判断文件是否可读,可读返回true
  • boolean canWrite()
    判断文件是否可写,可写返回true
  • boolean isHidden()
    判断文件是否隐藏,隐藏返回true

示例如下:

package file;

import java.io.File;

/**
 * File用来表示文件系统中的一个文件或目录
 * @author returnzc
 */
public class FileDemo {
    public static void main(String[] args) {
        //访问当前项目目录下的demo.txt文件
        File file = new File("./demo.txt");
        
        //获取名字
        String name = file.getName();
        System.out.println(name);
        
        //获取长度(单位是字节)
        long len = file.length();
        System.out.println(len);
        
        boolean cr = file.canRead();
        boolean cw = file.canWrite();
        System.out.println("可读:" + cr);
        System.out.println("可写:" + cw);
        
        boolean ih = file.isHidden();
        System.out.println("是否隐藏:" + ih);
    }
}

运行结果:

demo.txt
18
可读:true
可写:true
是否隐藏:false

1.2 创建、删除文件

判断文件或目录是否存在:

  • boolean exists()
    判断当前 File 表示的文件或目录是否已经存在,存在返回 true

创建文件:

  • boolean createNewFile() throws IOException
    创建新文件,需要处理异常

创建文件示例:

package file;

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

/**
 * 使用File创建一个文件
 * @author returnzc
 *
 */
public class CreateNewFileDemo {
    public static void main(String[] args) throws IOException {
        //在当前目录下创建名为 test.txt 的文件
        File file = new File("./test.txt");
        
        if (!file.exists()) {
            /*
             * 创建该文件
             * 需要注意,创建的文件所在的目录必须存在,否则会抛出异常。
             */
            file.createNewFile();
            System.out.println("文件已创建");
        } else {
            System.out.println("文件已存在");
        }
    }
}

删除文件、目录:

  • boolean delete()
    删除文件和目录。删除目录时只能删除空目录,非空目录需要挨个把所有子项都删掉才能删除。

删除文件:

package file;
import java.io.File;
/**
 * 删除一个文件
 * @author returnzc
 *
 */
public class DeleteFileDemo {
    public static void main(String[] args) {
        /*
         * 将当前项目目录下的test.txt文件删除
         * 在相对路径中,"./"是可以忽略不写的,默认就是从当前目录开始的。
         */
        File file = new File("./test.txt");
        if (file.exists()) {
            file.delete();
            System.out.println("文件已删除");
        } else {
            System.out.println("文件不存在");
        }
    }
}

1.3 创建、删除目录

创建目录:

  • boolean mkdir()
    创建目录,要求创建的目录所在的父目录必须存在
  • boolean mkdirs()
    创建多级目录,会将不存在的父目录一同创建出来

创建目录:

package file;
import java.io.File;
/**
 * 创建一个目录
 * @author returnzc
 *
 */
public class MkDirDemo {
    public static void main(String[] args) {
        //在当前目录下创建一个名为 demo 的目录
        File dir = new File("demo");
        if (!dir.exists()) {
            //创建该目录
            dir.mkdir();
            System.out.println("目录已创建");
        } else {
            System.out.println("目录已存在");
        }
    }
}

创建多级目录:

package file;
import java.io.File;
/**
 * 创建一个多级目录
 * @author returnzc
 *
 */
public class MkDirsDemo {
    public static void main(String[] args) {
        //在当前目录下创建 a/b/c/d/e/f 目录
        File dir = new File("a/b/c/d/e/f");
        if (!dir.exists()) {
            //mkdir()方法要求创建的目录所在的父目录必须存在
            //mkdirs()方法则会将不存在的父目录一同创建出来
            dir.mkdirs();
            System.out.println("创建完毕!");
        } else {
            System.out.println("目录已存在!");
        }
    }
}

删除目录:

package file;
import java.io.File;
/**
 * 删除目录
 * @author returnzc
 *
 */
public class DeleteDirDemo {
    public static void main(String[] args) {
        //将当前目录下的demo目录删除
        File dir = new File("a");
        if (!dir.exists()) {
            //delete方法在删除目录时要求该目录必须是一个空目录
            dir.delete();
            System.out.println("目录已删除");
        } else {
            System.out.println("目录不存在");
        }
    }
}

1.4 其他操作

  • boolean isDirectory()
    判断是否为目录
  • boolean isFile()
    判断是否为文件
  • File[] listFiles()
    列出所有文件

列出指定目录的所有文件:

package file;

import java.io.File;

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

        File[] subs = dir.listFiles();
        System.out.println(subs.length);
        for (int i = 0; i < subs.length; i++) {
            System.out.println(subs[i].getName());
        }
    }
}

运行结果:

6
.classpath
.project
.settings
bin
demo.txt
src

获取一个目录中的所有子项:

package file;
import java.io.File;
/**
 * 获取一个目录中的所有子项
 * @author returnzc
 *
 */
public class ListFilesDemo {
    public static void main(String[] args) {
        //获取当前目录中的所有子项
        File dir = new File(".");
        
        if (dir.isDirectory()) {
            File[] subs = dir.listFiles();
            for (int i = 0; i < subs.length; i++) {
                System.out.println(subs[i].getName());
            }
        }
    }
}

删除文件或目录(递归调用):

package file;
import java.io.File;
/**
 * 完成方法,实现将给定的File对象表示的文件或目录删除
 * @author returnzc
 *
 */
public class DeleteTestDemo {
    public static void main(String[] args) {
        File dir = new File("a");
        delete(dir);
    }

    public static void delete(File f) {
        if (f.isDirectory()) {
            //先将该目录清空
            File[] subs = f.listFiles();
            for (int i = 0; i < subs.length; i++) {
                File sub = subs[i];
                //先删除当前子项
                delete(sub);
            }
        }
        f.delete();
    }
}

1.5 文件过滤器

重载的ListFiles方法允许我们传入一个文件过滤器(作为参数),然后将目录中满足过滤器要求的子项返回。

文件过滤器是一个接口,如果用的话要实现类:

class MyFilter implements FileFilter {
    public boolean accept(File file) {
        String name = file.getName();
        return name.startsWith(".");
    }
}

示例:

package file;

import java.io.File;
import java.io.FileFilter;

/**
 * 重载的ListFiles方法,允许我们传入一个文件过滤器
 * 然后将目录中满足过滤器要求的子项返回
 */
public class FileDemo {
    public static void main(String[] args) {
        /*
         * 获取当前目录下所有文字以"."开头的子项
         */
        File dir = new File(".");

        /*
         * FileFilter 文件过滤器
         */
        MyFilter filter = new MyFilter();
        File[] subs = dir.listFiles(filter);
        System.out.println(subs.length);
        for (int i = 0; i < subs.length; i++) {
            System.out.println(subs[i].getName());
        }
    }
}

class MyFilter implements FileFilter {
    public boolean accept(File file) {
        String name = file.getName();
        System.out.println("正在过滤:" + name);
        return name.startsWith(".");
    }
}

运行结果:

正在过滤:.classpath
正在过滤:.project
正在过滤:.settings
正在过滤:bin
正在过滤:demo.txt
正在过滤:src
3
.classpath
.project
.settings

可以用匿名内部类:

/*
* FileFilter 文件过滤器
*/
FileFilter filter = new FileFilter() {
    public boolean accept(File file) {
        String name = file.getName();
        System.out.println("正在过滤:" + name);
        return name.startsWith(".");
    }
};

能少写就少写:

File[] subs = dir.listFiles(new FileFilter() {
    public boolean accept(File file) {
        String name = file.getName();
        System.out.println("正在过滤:" + name);
        return name.startsWith(".");
    }
});

JDK8后有lambda表达式

File[] subs = dir.listFiles((file)->{
        String name = file.getName();
        System.out.println("正在过滤:" + name);
        return name.startsWith(".");
    }
});

简化为:

File[] subs = dir.listFiles(
    (file)->file.getName().startsWith(".")
);

2. RandomAccessFile

3. 基本 IO 操作

4. 文件数据 IO 操作

占个坑,不要急,正在写~~

【Java】文件读写和输入输出

参考

相关文章

本文地址:https://blog.csdn.net/newcong0123/article/details/111570805

相关标签: Java