【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(资源) 的方式,减少代码量

相关推荐
hdsoft_huge1 小时前
SpringBoot系列06:RESTful接口开发,请求参数接收、全局跨域CORS完整配置
java·spring boot
IVVi0jToe1 小时前
高效C++线程池设计与实现
java·c++·安全
^yi1 小时前
【C++】内存管理
开发语言·c++
AC赳赳老秦1 小时前
采购专员自动化:OpenClaw 自动比价、生成询价单、跟踪供应商报价进度实战指南
开发语言·数据库·人工智能·python·自动化·github·openclaw
QiLinkOS1 小时前
QiLink OS的失败数据共享平台的运作模式是否适用于所有行业?
android·开发语言·人工智能·算法·重构·开源
卡梅德生物科技小能手1 小时前
卡美德生物科普:CD226(DNAM-1)在干细胞培养中的功能机制与应用
经验分享·深度学习·生活
CRMEB定制开发1 小时前
企业级Java电商系统选型路线图:从零到上线全流程拆解
java·开发语言·商城系统·小程序商城
Zhou1411361 小时前
Java常见面试题3
java·开发语言
云栖梦泽2 小时前
从 IMX415 摄像头驱动理解 Media Controller 框架
linux·开发语言·c++·嵌入式硬件