【Java基础复习】IO流(四)

个人主页: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对象存入文件

相关推荐
落苜蓿蓝8 小时前
Java 循环中对象复用导致属性覆盖?从 JVM 内存模型讲解原因
java·jvm·python
weixin_440784118 小时前
Android基础知识汇总
android·java·android studio
布鲁飞丝8 小时前
从零实现富文本编辑器#-浏览器选区与编辑器选区模型同步
java·前端·编辑器
不在逃避q8 小时前
一步一步学习使用LiveBindings()TListView进阶使用(),打造天气预报程序
服务器·数据库·学习
cszn20268 小时前
AI如何自动识别投标文件废标风险?智能评审项目实践
经验分享
AAwangzong9 小时前
从RPA到AI Agent:企业自动化能力演进的三个关键阶段
经验分享
鱼子星_9 小时前
【C++】深入剖析list:list及其双向迭代器实现
开发语言·数据结构·c++·笔记·stl·list
脚踏实地皮皮晨9 小时前
003002004_WPF Panel 基类 官方类定义
开发语言·windows·算法·c#·wpf·visual studio
jun_bai9 小时前
使用java安全的移动文件
java
caishenzhibiao9 小时前
市场同步系统 同花顺期货通指标
java·c语言·c#