【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流的体系,文件字节输入流,文件字节输出流,以及try语句

2.笔记对应视频156-160节

更新记录

创建时间:2025.10 完成初步撰写

更新1:2026.03 补充目录,并添加个人github主页链接

字符集

ASCII字符集,使用一个字节存储一个字符,首位是0,总共可表示128个字符

GBK,汉字编码字符集,一个中文字符使用两个字节存储,同时兼容了ASCII字符集,首位是1

Unicode字符集,统一编码,容纳世界上所有文字和符号,分为UTF-32和UTF-8

UTF-8,分为四个长度区,1个字节,2个字节,3个字节,4个字节。英文字符和数字等只占一个字节

Io4.java

Java 复制代码
package com.zbhgis.io;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Io4 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String data = "我学Java";
        byte[] bytes1 = data.getBytes();
        System.out.println(Arrays.toString(bytes1));

        // 这里需要抛出异常
        byte[] bytes2 = data.getBytes("GBK");
        System.out.println(Arrays.toString(bytes2));

        String s1 = new String(bytes1);
        System.out.println(s1);

        String s2 = new String(bytes2, "GBK");
        System.out.println(s2);
    }
}

打印结果

Plain 复制代码
[-26, -120, -111, -27, -83, -90, 74, 97, 118, 97]
[-50, -46, -47, -89, 74, 97, 118, 97]
我学Java
我学Java

IO流的体系

FileInputStream(文件字节输入流)

作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。但读取性能较差,且不适用于读汉字。

aa.txt

Plain 复制代码
asdfghjkl;'\

Io5.java

Java 复制代码
package com.zbhgis.io;

import java.io.FileInputStream;
import java.io.InputStream;

public class Io5 {
    public static void main(String[] args) throws Exception {
        InputStream is = new FileInputStream(("E:/AAAfile/gee_bakup/aaa/aa.txt"));
        // 获取单个字节
        int b1 = is.read();
        System.out.println((char) b1);

        int b2 = is.read();
        System.out.println((char) b2);

        int b3 = is.read();
        System.out.println((char) b3);

        // 上述is流未结束
        int b;
        while ((b = is.read()) != -1) {
            System.out.print((char) b);
        }
        System.out.println();
        is.close();

        // 新的is流
        InputStream is2 = new FileInputStream(("E:/AAAfile/gee_bakup/aaa/aa.txt"));
        while ((b = is2.read()) != -1) {
            System.out.print((char) b);
        }
        is2.close();
    }
}

打印结果

Plain 复制代码
a
s
d
fghjkl;'\
asdfghjkl;'\

一次性读取指定个数或全部字节

指定个数字节:使用上述api即可

全部字节:使用下面的方法和api

aa.txt

Plain 复制代码
asdfghjkl;'\

bb.txt

Plain 复制代码
asdfghjkl;'\
学java
不想学
Python和Java都学

Io6.java

Java 复制代码
package com.zbhgis.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class Io6 {
    public static void main(String[] args) throws Exception {
        InputStream is = new FileInputStream(("E:/AAAfile/gee_bakup/aaa/aa.txt"));

        // 每次读取多个字节
        byte[] buffer = new byte[10];
        int len = is.read(buffer);
        String rs = new String(buffer);
        System.out.println(rs);
        System.out.println("当次读取的字节数量:" + len);

        int len2 = is.read(buffer);
        // 不做限制
        String rs2 = new String(buffer);
        System.out.println(rs2);
        System.out.println("当次读取的字节数量:" + len2);
        // 读取多少就送出多少
        String rs3 = new String(buffer, 0, len2);
        System.out.println(rs3);
        System.out.println("当次读取的字节数量:" + len2);

        int lenEnd = is.read(buffer);
        System.out.println(lenEnd);
        is.close();
        System.out.println();

        InputStream is2 = new FileInputStream(("E:/AAAfile/gee_bakup/aaa/aa.txt"));
        byte[] buf = new byte[3];
        int size;
        while ((size = is2.read(buf)) != -1){
            String res = new String(buf, 0, size);
            System.out.println(res);
        }
        is2.close();
        System.out.println();

        // 一次性读取文件的全部字节
        InputStream is3 = new FileInputStream(("E:/AAAfile/gee_bakup/aaa/bb.txt"));
        File f = new File("E:/AAAfile/gee_bakup/aaa/bb.txt");
        long size3 = f.length();
        byte[] buffer3 = new byte[(int) size3];

        int len3 = is3.read(buffer3);
        System.out.println(new String(buffer3));
        System.out.println(size3);
        System.out.println(len3);

        is3.close();
        System.out.println();

        // 一次性读取文件的全部字节方式二
        InputStream is4 = new FileInputStream(("E:/AAAfile/gee_bakup/aaa/bb.txt"));
        byte[] buffer4 = is4.readAllBytes();
        System.out.println(new String(buffer4));

    }
}

打印结果

Plain 复制代码
asdfghjkl;
当次读取的字节数量:10
'\dfghjkl;
当次读取的字节数量:2
'\
当次读取的字节数量:2
-1

asd
fgh
jkl
;'\

asdfghjkl;'\
学java
不想学
Python和Java都学
53
53

asdfghjkl;'\
学java
不想学
Python和Java都学

FileOutputStream(文件字节输出流)

作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去。

Io7.java

Java 复制代码
package com.zbhgis.io;

import java.io.FileOutputStream;
import java.io.OutputStream;

public class Io7 {
    public static void main(String[] args) throws Exception {
        OutputStream os1 = new FileOutputStream("E:/AAAfile/gee_bakup/aaa/cc.txt");
        OutputStream os2 = new FileOutputStream("E:/AAAfile/gee_bakup/aaa/dd.txt", true);

        os1.write(98);
        os1.write('b');
        byte[] bytes = "China制造".getBytes();
        os1.write(bytes);
        os1.write(bytes,0,11);
        os1.write("\r\n".getBytes());
        os1.close();

        os2.write("China制造".getBytes());
        os2.write(bytes);
        os2.write("\r\n".getBytes());
        os2.close();
    }
}

结果

cc.txt

Plain 复制代码
bbChina制造China制造

dd.txt(运行三次)

Plain 复制代码
China制造China制造
China制造China制造
China制造China制造

文件复制代码实现

Io8.java

Java 复制代码
package com.zbhgis.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class Io8 {
    public static void main(String[] args) throws Exception{
        InputStream is = new FileInputStream("E:/AAAfile/gee_bakup/aaa/bb.txt");
        OutputStream os = new FileOutputStream("E:/AAAfile/gee_bakup/aaa/ee.txt");

        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        os.close();
        is.close();
        System.out.println("复制完成");
    }
}

try-catch/try-with

try-catch-finally:

try {

​ ...

​ ...

} catch (IOException e) {

​ e.printStackTrace();

} finally {

}

finally中的代码一定会执行,除非JVM终止;用于释放资源

Io9.java

Java 复制代码
package com.zbhgis.io;

import java.io.*;

public class Io9 {
    public static void main(String[] args) {
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream("E:/AAAfile/gee_bakup/aaa/bb.txt");
            os = new FileOutputStream("E:/AAAfile/gee_bakup/aaa/ee.txt");

            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (is != null) is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

try-with-resource:

try (资源1, 资源2) {

} catch () {

}

会自动释放try括号中的资源,比如流对象,自定义资源等实现了AutoCloseable接口的对象

MyConnection.java

Java 复制代码
package com.zbhgis.io;

public class MyConnection implements AutoCloseable{
    public void close() throws Exception{
        System.out.println("释放资源");
    }
}

Io10.java

Java 复制代码
package com.zbhgis.io;

public class Io10 {
    public static void main(String[] args) {
        try (
                MyConnection mc = new MyConnection();
        ) {
            System.out.println("try");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

打印结果

Plain 复制代码
try
释放资源

总结

1.汉字在不同字符集中所占字节不同

2.字节流擅长文件复制,其他的交给字符流

3.一次性读取全部字节建议使用readAllBytes()

4.try释放资源时最好使用try(资源) 的方式,减少代码量

相关推荐
一只小菜鸡..1 天前
南京大学 操作系统 (JYY) 学习笔记:进程、系统调用与状态机管理
笔记·学习
DeviceHub1 天前
硬件工程师选型笔记:ALPS RK12L1230C0K 与 Tonevee RK12L1230C0K 电位器 PIN TO PIN 评估指南
笔记
小Ti客栈1 天前
Spring Boot 集成 Springdoc-OpenAPI 与 Knife4j实现接口文档与可视化调试
java·spring boot·后端
互联网中的一颗神经元1 天前
小白python入门 - 39. 采集流水线小项目
开发语言·python
whyTeaFo1 天前
GAMES101: Lecture 13: Ray Tracing 1 (Whitted-Style Ray Tracing) ppt笔记
笔记
Wang's Blog1 天前
Go-Zero 项目开发22:用户群聊功能的实现与完善
开发语言·golang
Ai拆代码的曹操1 天前
Spring 事务 REQUIRES_NEW 嵌套调用:连接池翻倍的秘密
java·后端·spring
a1117761 天前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
动恰客流统计1 天前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
Ivanqhz1 天前
Rust &‘static str浅析
java·前端·javascript·rust