个人主页: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(资源) 的方式,减少代码量