文件IO (File对象, 文件读写)

简介: 文件IO (File对象, 文件读写)

文件

狭义的文件: 硬盘上的文件和目录(文件夹)

广义的文件: 泛指计算机中的很多 软硬件资源

  • OS 中, 把很多硬件设备和软件资源抽象成了文件, 按照文件的方式来统一管理
  • 网络编程中, OS 把网卡当成了一个文件来操作

路径

绝对路径: 以盘符**(c: d: e:)**开头的路径

相对路径: 以 当前所在目录 为基准, 或者以 . 或者 开头的路径 (当前所在目录 => 工作目录)


文件类型

文本文件: 存的是被字符集编码过的文本

二进制文件: 保存的是按照标准格式保存的非被字符集编码过的文件(存的是二进制数据, 不一定是字符串, 可以存任何类型数据 [图片, 音频 …])

如何区分 文本文件 和 二进制文件

用记事本打开文件

如果乱码, 就是二进制文件

如果不乱码, 就是文本文件


Java 对于文件的操作

  1. 针对文件系统的操作 (文件的创建, 删除, 重命名 …)
  2. 针对文件内容的操作 (文件的读和写)

针对文件系统的操作 (文件的创建, 使用, 重命名 …)

Java 标准库提供了 File 类方便我们对文件的操作


常见构造方法有两个


File(String pathname): 参数是文件对应的目录

下图为例: File file = new File("e:/test/b.txt"); 或者 File file = new File("e:\\test\\b.txt"); (注意转义字符)

File(String parent, String child): parent 表示当前文件所在目录, child 表示自身的文件名

下图为例: File file = new File("e:/test", "b.txt");

常用 API 分析


根据 FIle 对象创建删除文件和文件夹

  public static void main(String[] args) throws IOException {
        File context = new File("./test/aaa/bbb");

        // 创建目录(只能创建一级, 如果中间目录不存在, 则创建失败)
        context.mkdir();
        // 创建目录(如果中间目录不存在, 会创建中间目录)
        context.mkdirs();
        
        File file = new File("./test/aaa/bbb/a.txt");

        // 如果文件不存在就把它创建出来, 如果已存在则不进行任何操作
        // 如果创建成功返回 true, 创建失败返回 false
        file.createNewFile();

        //根据 File对象删除文件, 成功删除返回 true
        file.delete();
    }

获取文件的信息

public static void main(String[] args) {
    File file = new File("./test/aaa/bbb/a.txt");
    // 判断 File 对象描述的文件是否存在
    System.out.println("file.exists(): " + file.exists());
    // 获取 File 对象的文件名称(不含路径)
    System.out.println("file.getName(): " + file.getName());
    // 获取 File 对象的父目录文件路径
    System.out.println("file.getParent(): " + file.getParent());
    // 获取 File 对象的文件路径
    System.out.println("file.getPath(): " + file.getPath());
    // 获取 File 对象的绝对路径
    System.out.println("file.getAbsolutePath(): " + file.getAbsolutePath());

    // 判断 File 对象是否是一个文件
    System.out.println("file.isFile(): " + file.isFile());
    // 判断 File 对象是否是一个目录
    System.out.println("file.isDirectory(): " + file.isDirectory());
}

运行结果


获取目录下的文件名/文件

public static void main(String[] args) {
  File file = new File("e:/test");
    // 获取 File 对象代表的目录下的所有文件名
    String[] fileName = file.list();
    // 获取 File 对象代表的目录下的所有文件, 以 File 对象表示
    File[] files = file.listFiles();

    for(String s : fileName) {
        System.out.println(s);
    }

    for (File f : files){
        System.out.println(f.toString());
    }
}

运行结果


文件改名/剪切/粘贴

public static void main(String[] args) {
    File file = new File("./test/aaa/bbb/a.txt");
    File file1 = new File("./test/aaa/bbb/b.txt");

    // 删除 file 对象对应的文件, 并将其放到 file2 中去 (并且重命名)
    file.renameTo(file1);
}

运行结果


针对文件内容的操作 (文件的读和写)

针对文件内容, 使用 “流对象” 进行操作.

attention: 文件的读写, 是针对文件来说的, 从文件读内容到内存, 从内存写内容到文件, 或者再简单一点, 从文件读, 写到文件里(~~这个玩意好长一段时间我傻傻分不清~~ )


Java 标准库的流对象, 分为两个大类

  1. 字节流 (操作二进制数据)
  • InputStream FileInputStream
  • OutputStream FileOutputStream
  1. 字符流 (操作文本数据)
  • Reader FileReader

attention: 读文件的操作不会对文件内容产生影响, 但是写文件操作, 默认情况下, 流对象在打开文件的同时, 就会清空文件内容, 如果想要实现 "追加写", 可在打开文件时修改参数

上述类对象的核心操作如下:

  1. 打开文件 (构造对象)
  2. 关闭文件 (close)
  3. 读文件(read) => 针对 InputStream / Reader
  4. 写文件(write) => 针对 OutputStream / Writer
InputStream

read:用来读取字节

read(): 无参版本, 一次读一个字节, 返回值为读到的字节, 当读不到内容时(EOF) , 返回值为 -1.

read(byte[] b):尽可能多的将数据读取到 b 数组里, 返回值为读取到字节的数量, 当读取完毕后再读取, 返回值为 -1.

read(byte[] b, int off, int len): 读取 len 长度的字节到 b 数组里, 从off 下标开始填充.

read()

public static void main(String[] args) throws IOException {
    File file = new File("./test/aaa/bbb/b.txt");
    InputStream inputStream = new FileInputStream(file);

    // 单个字符, 进行读操作
    while(true) {
        int b = inputStream.read();
        if(b == -1) break;
        System.out.print(b + " ");
    }

    inputStream.close();
}


read(byte[] b) & read(byte[] b, int off, int len)

public static void main(String[] args) throws IOException {
   File file = new File("./test/aaa/bbb/b.txt");
    InputStream inputStream = new FileInputStream(file);

   while(true) {
       byte[] buffer = new byte[1024];
       // 读取的数据填充到 buffer 数组中
       // 从下标 0 开始填充, 尽可能填充满 buffer.length 的容量
       int len = inputStream.read(buffer, 0, buffer.length);
       if(len == -1) break;
       System.out.println(new String(buffer));

   }

    inputStream.close();
}


Scanner

Scanner 搭配流对象进行使用 (InputStream 也是流对象)

public static void main(String[] args) throws IOException {
   try (InputStream inputStream = new FileInputStream("./test/aaa/bbb/b.txt")) {
        Scanner scanner = new Scanner(inputStream);
        System.out.println(scanner.next());
    }
}


OutputStream

各参数版本同上, 不再赘述


write()

public static void main(String[] args) throws IOException {
    try (OutputStream outputStream = new FileOutputStream("./test/aaa/bbb/b.txt")) {
        outputStream.write(97);
        outputStream.write(98);
        outputStream.write(99);
    }
}


write(byte[] b) & write(byte[] b,int off, int len)

public static void main(String[] args) throws IOException {
    try (OutputStream outputStream = new FileOutputStream("./test/aaa/bbb/b.txt")) {
        byte[] buffer = "hello 朱睿杰".getBytes(StandardCharsets.UTF_8);
        outputStream.write(buffer,0 ,buffer.length);
    }
}


Reader


read()

public static void main(String[] args) throws IOException {
    try (Reader reader = new FileReader("./test/aaa/bbb/b.txt")) {
        while(true) {
            int ch = reader.read();
            if(ch == -1) break;
            System.out.print((char)ch);
        }
    }
}


read(char[] cbuf) & read(char[] cbuf, int off, int len)

    public static void main(String[] args) throws IOException {
        try (Reader reader = new FileReader("./test/aaa/bbb/b.txt")) {
            char[] buffer = new char[1024];
            while(true) {
                int ch = reader.read(buffer, 0 , buffer.length);
                if(ch == -1) break;
                System.out.print(buffer);
            }
        }
    }


Writer

public static void main(String[] args) throws IOException {
    try (Writer writer = new FileWriter("./test/aaa/bbb/b.txt")) {
        String str = "abcdefg";
        char[] cbuf = "朱睿杰".toCharArray();
        writer.write(97);
        writer.write("\n");

        writer.write(str);
        writer.write("\n");
        writer.write(str, 0, 3); //读取str, 往文件里写, 从下标 0开始, 到下标 3结束
        writer.write("\n");

        writer.write(cbuf);
        writer.write("\n");
        writer.write(cbuf,0, 2);
        writer.write("\n");
    }
}

f4cc9d83e9e347329dff713b31b08da9.png

目录
相关文章
|
20天前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
117 1
|
4月前
|
XML JSON Go
Go语言中的文件与IO:JSON、CSV、XML处理
本文介绍了 Go 语言中对 JSON、CSV 和 XML 三种常见数据格式的处理方法。通过标准库 `encoding/json`、`encoding/csv` 和 `encoding/xml`,可以实现结构体与数据格式之间的序列化与反序列化。JSON 适合 Web API 和前后端通信,因其清晰易读;CSV 适用于表格数据和轻量级交换;XML 则支持复杂嵌套结构,常用于配置文件和 SOAP 协议。文中提供代码示例,涵盖基本使用、嵌套结构处理及实战建议,帮助开发者高效操作这些格式。
|
4月前
|
Unix Go
Go语言中的文件与IO:文件读写
本文介绍了 Go 语言中文件操作的基础方法,涵盖打开与关闭文件、读取和写入文件内容、追加写入以及复制文件等功能。通过 `os`、`bufio` 和 `io` 等标准库包,提供了高效且灵活的实现方式,如使用 `os.ReadFile` 读取整个文件、`bufio.Scanner` 逐行读取、`os.Create` 创建文件以及 `io.Copy` 复制文件内容。同时强调了错误处理的重要性,例如使用 `defer` 确保文件关闭,并推荐注意文件权限设置(如 UNIX 系统中的 `0644`)。最后以表格形式总结了常用操作及其推荐方法,便于快速查阅和应用。
|
4月前
|
Go 数据处理
Go语言中的文件与IO:bufio 和 scanner
Go 标准库中的 `bufio` 包高效读写功能,适用于文件和数据处理。`bufio.Reader` 支持按行或分隔符读取,`bufio.Writer` 提供高性能写入并需调用 `Flush()` 确保数据写入。`bufio.Scanner` 是处理文本文件(如日志、配置)的利器,可按行、单词等分割内容。本文详解其用法,并给出实践建议,如统计字符数、模拟 `tail -f` 和词频分析等。
|
4月前
|
Linux C语言 网络架构
Linux的基础IO内容补充-FILE
而当我们将运行结果重定向到log.txt文件时,数据的刷新策略就变为了全缓冲,此时我们使用printf和fwrite函数打印的数据都打印到了C语言自带的缓冲区当中,之后当我们使用fork函数创建子进程时,由于进程间具有独立性,而之后当父进程或是子进程对要刷新缓冲区内容时,本质就是对父子进程共享的数据进行了修改,此时就需要对数据进行写时拷贝,至此缓冲区当中的数据就变成了两份,一份父进程的,一份子进程的,所以重定向到log.txt文件当中printf和fwrite函数打印的数据就有两份。此时我们就可以知道,
78 0
|
8月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
340 34
|
9月前
|
存储 弹性计算 固态存储
阿里云服务器ESSD Entry系统盘测评IOPS、IO读写和时延性能参数
阿里云ESSD Entry云盘是新一代企业级云盘,具备高IOPS、低延迟特性,适合开发与测试场景。它提供10~32,768 GiB容量范围,最大IOPS达6,000,吞吐量150 MB/s,时延1~3 ms。支持按量付费和包年包月,性价比高,特别适合个人开发者和中小企业。详情及价格参考阿里云官网。
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
637 12