文件操作和IO

一、java.io.File

File 类是 Java 传统 I/Ojava.io 包)中用于表示文件或目录路径名的类。它不操作文件内容(读写内容需配合流),而是提供对文件/目录元数据(如路径、名称、大小、修改时间、权限、是否存在等)以及创建、删除、重命名、遍历目录等操作。

1.1、构造方法

代码示例:

java 复制代码
// 示例
File f1 = new File("/home/user/data.txt");
File f2 = new File("/home/user", "data.txt");
File parent = new File("/home/user");
File f3 = new File(parent, "data.txt");

路径可以是绝对路径或相对路径。

1.2、常用方法分类

1.2.1、 路径名相关

1.2.2、文件/目录判断

1.2.3、文件/目录操作

1.2.4、获取属性

1.2.5、目录操作

二、数据流

2.1、InputStream概述

java.io.InputStream 是 Java I/O 体系中所有字节输入流的抽象基类。它定义了从数据源(文件、网络、内存数组等)读取字节的基本方法,是字节输入流的根接口(实际是抽象类)。任何字节输入流都直接或间接继承自 InputStream

核心方法详解:

重要细节

  • 阻塞行为:read() 是阻塞调用,会等待直到有数据、到达流末尾或抛出异常。

  • 返回 -1:表示流结束(EOF),这是判断结束的标准方式。

  • available():用于非阻塞场景,例如网络流中判断是否有数据可读而不阻塞。

  • mark/reset:仅部分子类支持(如 BufferedInputStream、ByteArrayInputStream),FileInputStream 不支持。

2.2、FileInputStream概述

java.io.FileInputStream 是 Java 中从文件系统读取原始字节的输入流,继承自 InputStream。它是 Java I/O 体系中最常用的文件字节输入流,用于读取二进制文件(图片、音频、视频、可执行文件)或文本文件的原始字节(配合 InputStreamReader 可转为字符流)。

构造方法

注意:所有构造方法都会实际打开文件(关联操作系统文件句柄),若文件不存在、无读取权限或是一个目录,则抛出 FileNotFoundException

代码示例

示例1:

将文件完全读完的两种方式。相比较而言,后一种的IO次数更少,性能更好。

java 复制代码
import java.io .*;

// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充"Hello"的内容
public class Test {
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("hello.txt")) {
            while (true) {
                int b = is.read();
                if (b == -1) {
                    // 代表文件已经全部读完
                    break;
                }
                System.out.printf("%c", b);
            }

        }

    }
}

运行结果如下:

示例2:

java 复制代码
import java.io .*;

// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充"Hello"的内容
public class Test02 {
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("hello.txt")) {
            byte[] buf = new byte[1024];
            int len;

            while (true) {
                len = is.read(buf);
                if (len == -1) {
                    // 代表文件已经全部读完
                    break;

                }

                for (int i = 0; i < len; i++) {
                    System.out.printf("%c", buf[i]);

                }

            }

        }
    }
}

运行结果如下:

示例2:

把文件内容中填充中文

java 复制代码
import java.io .*;

// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充"你好中国"的内容
public class Test03 {
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("hello.txt")) {
            byte[] buf = new byte[1024];
            int len;

            while (true) {
                len = is.read(buf);
                if (len == -1) {
                    // 代表文件已经全部读完
                    break;
                }
                // 每次使用 3 字节进行 utf-8 解码,得到中文字符
                // 利用 String 中的构造方法完成
                // 这个方法了解下即可,不是通用的解决办法
                for (int i = 0; i < len; i += 3) {
                    String s = new String(buf, i, 3, "UTF-8");
                    System.out.printf("%s", s);

                }
            }
        }
    }
}

运行结果如下:

2.3、利用Scanner进行字符读取

上述例子中,我们看到了对字符类型直接使用InputStream进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是Scanner类。

构造方法

示例:

java 复制代码
import java.io .*;
import java.util .*;

// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充"你好中国"的内容
public class Test04 {
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("hello.txt")) {
            try (Scanner scanner = new Scanner(is, "UTF-8")) {
                while (scanner.hasNext()) {
                    String s = scanner.next();
                    System.out.print(s);
                }

            }
        }
    }
}

运行结果如下:

2.4、OutputStream概述

核心方法

2.5、利用OutputStreamWriter 进行字符写入

示例1:

java 复制代码
import java. io .*;

public class Test05 {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("output.txt")) {
            os.write('H');
            os.write('e');
            os.write('l');
            os.write('l');
            os.write('o');
            // 不要忘记 flush
            os.flush();
        }
    }
}

运行结果:

output.txt 文件夹下写入了Hello。

示例2:

java 复制代码
import java. io .*;

public class Test06 {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("output.txt")) {
            byte[] b = new byte[]{
                    (byte) 'G', (byte) 'o', (byte) 'o', (byte) 'd'
            };
            os.write(b);
            // 不要忘记 flush
            os.flush();
        }
    }
}

运行结果:

output.txt 文件夹下Hello 变成了 Good。

示例3:

java 复制代码
import java.io .*;

public class Test07 {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("output.txt") ) {
            byte[] b = new byte[] {
                    (byte)'G', (byte)'o',(byte)'o', (byte)'d', (byte)'B', (byte)'a'
            };
            os.write(b, 0,4);
            // 不要忘记 flush
            os.flush();

        }

    }
}

运行结果:

output.txt 文件夹下内容为 Good。

示例4:

java 复制代码
import java. io .*;

public class Test08 {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("output.txt")) {
            String s = "Nothing";
            byte[] b = s.getBytes();
            os.write(b);
            // 不要忘记 flush
            os.flush();
        }
    }
}

运行结果如下:

output.txt 文件夹下内容为 Nothing。

示例5:

java 复制代码
import java.io .*;

public class Test09 {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("output.txt")) {
            String s = "你好中国";
            byte[] b = s.getBytes("utf-8");
            os.write(b);

// 不要忘记 flush
            os.flush();

        }

    }
}

运行结果如下:

output.txt 文件夹下内容为: 你好中国。

2.6、利用PrintWriter找到我们熟悉的方法

上述,我们其实已经完成输出工作,但总是有所不方便,我们接来下将OutputStream处理下,使用PrintWriter类来完成输出,因为PrintWriter类中提供了我们熟悉的print/println/printf方法

示例:

java 复制代码
import java. io .*;

public class Test10 {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("output.txt")) {
            try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-8")){
                try (PrintWriter writer = new PrintWriter(osWriter)) {
                    writer.println("我是第一行");
                    writer.print("我的第二行\r\n");
                    writer.printf("%d:我的第三行\r\n",1+1);
                    writer.flush();
                }
            }
        }
    }
}
相关推荐
嘻哈∠※6 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
WWJA王文举6 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
zhanghaha13147 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
白狐_7987 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2587 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅8 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
qq_448011168 小时前
C语言中的动态内存分配
c语言·开发语言·php
汉字萌萌哒9 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter9 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
极创信息9 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate