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

相关推荐
NiceCloud喜云1 小时前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai
cui_ruicheng1 小时前
Python从入门到实战(六):非序列容器
开发语言·python
SamDeepThinking1 小时前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试
西西学代码1 小时前
Flutter---底部导航栏(2)
开发语言·javascript·flutter
legendary_1631 小时前
SINK芯片:Type-C统一供电时代的小家电核心方案
c语言·开发语言·人工智能·智能手机
momo1 小时前
JAVA基础知识
java·开发语言
恣逍信点2 小时前
《凌微经》助读:本体论根基——“无之自悖”与“形性一体”
人工智能·科技·学习·程序人生·生活·交友·哲学
就叫_这个吧2 小时前
Activiti7工作流入门+案例应用
java·activiti7·工作流
德思特2 小时前
从靠天吃饭到科技种田,虹科&德思特与极飞科技聊聊农业无人机不迷路的 “硬核底气“
经验分享
Z_W_H_2 小时前
minikube start --driver=docker --memory=4000mb出现PROVIDER_DOCKER_NEWGRP
java·docker·minikube