Java输入输出流
 # 概述
Java的输入输出流用于读取和写入字节数据。Java的输入输出流分为输入流和输出流,输入流用于读取字节数据,输出流用于写入字节数据。Java的输入输出流类位于java.io包中。
# 常用输入流
InputStream:所有输入流的基类,用于读取字节数据。FileInputStream:从文件中读取字节。BufferedInputStream:提供缓冲功能的输入流。DataInputStream:提供对基本数据类型和对象进行序列化和反序列化的输入流。ObjectInputStream:提供对对象进行序列化和反序列化的输入流。ByteArrayInputStream:从字节数组中读取字节。- ......
 
# 常用输出流
OutputStream:所有输出流的基类,用于写入字节数据。FileOutputStream:向文件中写入字节。BufferedOutputStream:提供缓冲功能的输出流。DataOutputStream:提供对基本数据类型和对象进行序列化和反序列化的输出流。ObjectOutputStream:提供对对象进行序列化和反序列化的输出流。ByteArrayOutputStream:向字节数组中写入字节。- ......
 
# 示例代码
import java.io.*;
public class Test {
    public static void main(String[] args) {
        try {
            // 写入文件
            FileOutputStream fos = new FileOutputStream("test.txt");
            fos.write("Hello, world!".getBytes());
            fos.close();
            // 读取文件
            FileInputStream fis = new FileInputStream("test.txt");
            int data = 0;
            while ((data = fis.read())!= -1) {
                System.out.print((char) data);
            }
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 常用方法
read():从输入流中读取一个字节。read(byte[] b):从输入流中读取字节数组。read(byte[] b, int off, int len):从输入流中读取字节数组的某一部分。skip(long n):跳过输入流中的n字节。available():返回输入流中可读取的字节数。close():关闭输入流。flush():刷新输出流。write(int b):向输出流中写入一个字节。write(byte[] b):向输出流中写入字节数组。write(byte[] b, int off, int len):向输出流中写入字节数组的某一部分。close():关闭输出流。
# 注意事项
- 输入流和输出流都需要通过
close()方法关闭。 - 输入流和输出流都可以用
try-catch块来捕获异常。 - 输入流和输出流都可以用
available()方法获取可读取的字节数。 - 输入流和输出流都可以用
flush()方法刷新缓冲区。 
# 序列化和反序列化
Java的序列化和反序列化是指将对象转换为字节序列,并在需要时恢复对象。Java提供了ObjectOutputStream和ObjectInputStream类来实现序列化和反序列化。
ObjectOutputStream:用于序列化对象。ObjectInputStream:用于反序列化对象。DataInputStream:用于反序列化基本数据类型和对象。DataOutputStream:用于序列化基本数据类型和对象。
# ObjectInputStream和ObjectOutputStream
示例代码:
import java.io.*;
public class Test {
    public static void main(String[] args) {
        try {
            // 序列化
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.txt"));
            oos.writeObject(new Person("Tom", 20));
            oos.close();
            // 反序列化
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
            Person person = (Person) ois.readObject();
            System.out.println(person.getName() + " " + person.getAge());
            ois.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
class Person implements Serializable {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# DataInputStream和DataOutputStream
示例代码:
import java.io.*;
public class Test {
    public static void main(String[] args) {
        try {
            // 序列化
            DataOutputStream dos = new DataOutputStream(new FileOutputStream("test.txt"));
            dos.writeUTF("Hello, world!");
            dos.writeInt(123456);
            dos.close();
            // 反序列化
            DataInputStream dis = new DataInputStream(new FileInputStream("test.txt"));
            String str = dis.readUTF();
            int num = dis.readInt();
            System.out.println(str + " " + num);
            dis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 区别
- 序列化和反序列化是指将对象转换为字节序列,并在需要时恢复对象。
 ObjectOutputStream和ObjectInputStream类用于对象实现序列化和反序列化。DataInputStream和DataOutputStream类用于对基本数据类型和对象进行序列化和反序列化。
# 总结
- Java的输入输出流用于读取和写入字节数据。
 - 输入流和输出流分别由
InputStream和OutputStream类表示。 - 常用的输入流包括
FileInputStream、BufferedInputStream、ObjectInputStream、ByteArrayInputStream和DataInputStream。 - 常用的输出流包括
FileOutputStream、BufferedOutputStream、ObjectOutputStream、ByteArrayOutputStream和DataOutputStream。 
最后更新时间: 2025/01/02, 14:49:49