欢迎光临
我们一直在努力

【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个字节。英文字符和数字等只占一个字节

img

Io4.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);
}
}

打印结果

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

IO流的体系

img

FileInputStream(文件字节输入流)

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

img

aa.txt

asdfghjkl;'\\

Io5.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();
}
}

打印结果

a
s
d
fghjkl;'\\
asdfghjkl;'\\

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

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

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

img

aa.txt

asdfghjkl;'\\

bb.txt

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

Io6.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));

}
}

打印结果

asdfghjkl;
当次读取的字节数量:10
'\\dfghjkl;
当次读取的字节数量:2
'\\
当次读取的字节数量:2
-1

asd
fgh
jkl
;'\\

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

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

FileOutputStream(文件字节输出流)

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

img

Io7.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

bbChina制造China制造

dd.txt(运行三次)

China制造China制造
China制造China制造
China制造China制造

文件复制代码实现

Io8.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

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

package com.zbhgis.io;

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

Io10.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();
}
}
}

打印结果

try
释放资源

总结

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

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

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

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

赞(0)
未经允许不得转载:171主机测评 » 【Java基础复习】IO流(二)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址