个人主页:https://github.com/zbhgis
前言
1.之前学过,因此本文是个人复习笔记,为视频的总结以及个人思考,可能不是很详细。
2.教程是b站黑马程序员的JAVASE基础课程,笔记中的大部分图片来自于视频中的PPT截图。
3.Java环境为Java SE 17.0.3.1,IntelliJ IDEA版本为2025.2
https://www.bilibili.com/video/BV1Cv411372m
内容概览
1.本文内容主要包括转换流,打印流,数据流,序列化流,以及IO框架入门
2.笔记对应视频164-168节
更新记录
创建时间:2025.10 完成初步撰写
更新1:2026.03 补充目录,并添加个人github主页链接
乱码问题

转换流
InputStreamReader(字符输入转换流)
按照文件真实的字符集编码转为字符输入流

Io17.java
Java
package com.zbhgis.io;
import java.io.*;
public class Io17 {
public static void main(String[] args) throws Exception {
try (
InputStream is = new FileInputStream("E:/AAAfile/gee_bakup/aaa/bb.txt");
Reader isr = new InputStreamReader(is, "UTF-8");
BufferedReader br = new BufferedReader(isr);
) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
throw new Exception(e);
}
}
}
打印结果
Plain
asdfghjkl;'\
学java
不想学
Python和Java都学
OutputStreamWriter(字符输出转换流)
指定字符输出的字符集编码

Io18.java
Java
package com.zbhgis.io;
import java.io.*;
public class Io18 {
public static void main(String[] args) throws Exception {
try (
OutputStream os = new FileOutputStream("E:/AAAfile/gee_bakup/aaa/ii.txt");
Writer osw = new OutputStreamWriter(os, "GBK");
BufferedWriter bw = new BufferedWriter(osw);) {
bw.write("中国");
bw.write("NO.1");
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印结果
Java
package com.zbhgis.io;
import java.io.*;
public class Io18 {
public static void main(String[] args) throws Exception {
try (
OutputStream os = new FileOutputStream("E:/AAAfile/gee_bakup/aaa/ii.txt");
Writer osw = new OutputStreamWriter(os, "GBK");
BufferedWriter bw = new BufferedWriter(osw);) {
bw.write("中国");
bw.write("NO.1");
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印流
打印流可以实现更方便,高效的打印数据出去

Io19.java
Java
package com.zbhgis.io;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
public class Io19 {
public static void main(String[] args) throws Exception {
try (
// PrintStream ps = new PrintStream("E:/AAAfile/gee_bakup/aaa/jj.txt", Charset.forName("GBK"));
PrintStream ps = new PrintStream("E:/AAAfile/gee_bakup/aaa/jj.txt");
// PrintWriter pw = new PrintWriter(new FileOutputStream("E:/AAAfile/gee_bakup/aaa/kk.txt", true));
PrintWriter pw = new PrintWriter(new FileOutputStream("E:/AAAfile/gee_bakup/aaa/kk.txt"));
) {
ps.println(97);
ps.println(99.5);
ps.println("中国");
ps.println(true);
ps.write(97);
// 将默认打印位置调整为ps流
System.setOut(ps);
System.out.println();
System.out.println("NO.1");
System.out.println("中国");
pw.println(9);
pw.println(49.0);
pw.println(49);
pw.println("中国");
pw.println(false);
} catch (Exception e) {
e.printStackTrace();
}
}
}
jj.txt
Plain
97
99.5
中国
true
a
NO.1
中国
kk.txt
Plain
9
49.0
49
中国
false
数据流
DataOutputStream(数据输出流)
包装基础的字节输出流,将数据与其类型一并写出去

Io20.java
Java
package com.zbhgis.io;
import java.io.*;
public class Io20 {
public static void main(String[] args) {
try (DataOutputStream dos =
new DataOutputStream((new FileOutputStream("E:/AAAfile/gee_bakup/aaa/ll.txt")));
) {
dos.writeInt(96);
dos.writeDouble(99.5);
dos.writeBoolean(false);
dos.writeChar('C');
dos.writeUTF("中国");
} catch (Exception e) {
e.printStackTrace();
}
}
}
ll.txt

DataInputStream(数据输入流)
用于读取数据输出流写出的数据。

Io21.java
Java
package com.zbhgis.io;
import java.io.*;
public class Io21 {
public static void main(String[] args) {
try (DataInputStream dis =
new DataInputStream((new FileInputStream("E:/AAAfile/gee_bakup/aaa/ll.txt")));
) {
System.out.println(dis.readInt());
System.out.println(dis.readDouble());
System.out.println(dis.readBoolean());
System.out.println(dis.readChar());
System.out.println(dis.readUTF());
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印结果
Plain
96
99.5
false
C
中国
序列化流
ObjectOutputStream(对象字节输出流)
可以把java对象进行序列化:把java对象存入到文件中

User.java
Java
package com.zbhgis.io;
import java.io.Serializable;
// 对象如果需要序列化,必须实现序列化接口
public class User implements Serializable {
private String loginName;
private String userName;
private int age;
// transient修饰符可以避免被序列化
private transient String password;
public User() {
}
public User(String loginName, String userName, int age, String password) {
this.loginName = loginName;
this.userName = userName;
this.age = age;
this.password = password;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"loginName='" + loginName + '\'' +
", userName='" + userName + '\'' +
", age=" + age +
", password='" + password + '\'' +
'}';
}
}
Io22.java
Java
package com.zbhgis.io;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class Io22 {
public static void main(String[] args) {
try (
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:/AAAfile/gee_bakup/aaa/mm.txt"));
) {
User u1 = new User("admin", "张三", 32, "789456");
User u2 = new User("user", "李四", 32, "456456");
User u3 = new User("user", "王五", 32, "123123");
ArrayList<User> users = new ArrayList<>();
users.add(u1);
users.add(u2);
users.add(u3);
// 可以序列化单个
// oos.writeObject(u1);
// 也可以传入ArrayList后一起序列化
oos.writeObject(users);
System.out.println("序列化对象成功");
} catch (Exception e) {
e.printStackTrace();
}
}
}
mm.txt

ObjectInputStream(对象字节输入流)
可以把java对象进行反序列化

Io23.java
Java
package com.zbhgis.io;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;
public class Io23 {
public static void main(String[] args) {
try (
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:/AAAfile/gee_bakup/aaa/mm.txt"));
) {
ArrayList<User> users = (ArrayList<User>) ois.readObject();
System.out.println(users);
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印结果
Plain
[User{loginName='admin', userName='张三', age=32, password='null'}, User{loginName='user', userName='李四', age=32, password='null'}, User{loginName='user', userName='王五', age=32, password='null'}]
IO框架入门
提供解决方案的高度封装的jar包
Commons-io

去官网下载zip压缩包后,将其中的jar包拷贝到项目下新建的lib目录下,然后右键选择【Add as Library】
https://commons.apache.org/io/download_io.cgi


Io24.java
Java
package com.zbhgis.io;
import org.apache.commons.io.FileUtils;
import java.io.File;
public class Io24 {
public static void main(String[] args) throws Exception {
FileUtils.copyFile(new File("E:/AAAfile/gee_bakup/aaa/bb.txt"),
new File("E:/AAAfile/gee_bakup/aaa/nn.txt"));
FileUtils.copyDirectory(new File("E:/AAAfile/gee_bakup/aaa"),
new File("E:/AAAfile/gee_bakup/ddd"));
// Java原生代码
// Files.copy(Path.of("E:/AAAfile/gee_bakup/aaat/bb.xt"),
// Path.of("E:/AAAfile/gee_bakup/aaat/oo.xt"));
// System.out.println(Files.readString(Path.of("E:/AAAfile/gee_bakup/aaat/bb.xt")));
}
}
总结
1.转换流用于包装字符流,可以指定编码形式
2.打印流输出数据更加高效
3.数据流将数据类型一并输出
4.序列化流可以将java对象存入文件