【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对象存入文件

相关推荐
孙启超7 小时前
【AI开发之Rust】第 1 课:认识 Rust 与开发环境 —— 装好工具链,跑通第一个程序
开发语言·人工智能·后端·ai·rust·安全架构
sunshine22 girl7 小时前
Java学习一 环境配置3 Idea中的maven仓库,pom.xml文件配置
学习·maven·intellij-idea
君顾17 小时前
家政派单小程序源码开发实战:从零搭建到上线全流程指南
java·开发语言·家政派单
流烟默7 小时前
HTTP 连接管理技术梳理:JDK KeepAliveCache 机制与池化选型
java·网络协议·http
阿酷tony7 小时前
视频专栏列表的防录屏水印和跑马灯效果(也可网站调用)
java·前端·音视频
洋不写bug8 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
xcl09258 小时前
全民健身智慧管理系统实战指南:从架构设计到部署落地
java·spring boot
Bs_MoneyMagnet8 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
ly76898 小时前
生产环境 Spring Boot 应用内存泄漏排查实战
java·spring boot·spring·内存泄漏·threadlocal·gc日志·堆转储
IT小白杨8 小时前
eBay多账号如何应对关联判定:主体、收款、IP、环境四层配置清单一次讲清
java·网络·网络协议·tcp/ip·自动化·指纹浏览器