Java:IO流
·
一、IO 流核心概念与整体体系
1. 什么是 IO 流
IO:Input 输入、Output 输出流:数据在设备间按字节 / 字符顺序传输的通道,Java IO 用于文件读写、网络传输、数据持久化。
2. IO 流两大核心分类
IO流
├─ 字节流:以 1字节(8bit) 为单位
│ 适合:图片、视频、音频、压缩包、所有二进制文件
│ 顶层父类:InputStream / OutputStream
└─ 字符流:以 1字符 为单位,底层=字节流+编码表
适合:纯文本文件 txt/java/html
顶层父类:Reader / Writer
3. 四大抽象基类总览
- 字节输入:
InputStream - 字节输出:
OutputStream - 字符输入:
Reader - 字符输出:
Writer
四大基类都是抽象类,不能直接 new,只能用子类实现。
二、字符流体系(Reader / Writer)
1. 字符输入流 Reader
继承层级简图
Reader 抽象父类
├─ FileReader 文件字符输入流
├─ InputStreamReader 字节转字符转换流
└─ BufferedReader 缓冲字符输入流(高效、按行读)
各类作用
- FileReader:直接按字符读取文本文件,使用默认编码。
- InputStreamReader:转换流,把字节流转字符流,可手动指定编码,解决乱码。
- BufferedReader:带缓冲区,效率高,独有
readLine()按整行读取。
完整代码示例(try-with-resources 自动关流)
import java.io.*;
public class CharInputDemo {
public static void main(String[] args) {
// 1. FileReader 单个字符读取
try (FileReader fr = new FileReader("test.txt")) {
int ch;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
// 2. 转换流 指定UTF-8编码
try (InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8")) {
int ch;
while ((ch = isr.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
// 3. BufferedReader 按行读取
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 字符输出流 Writer
继承层级简图
Writer 抽象父类
├─ FileWriter 文件字符输出流
├─ OutputStreamWriter 字符转字节转换流
└─ BufferedWriter 缓冲字符输出流
各类作用
- FileWriter:向文本文件写入字符,默认覆盖原文件。
- OutputStreamWriter:转换流,指定编码写入,防止乱码。
- BufferedWriter:缓冲高效写入,独有
newLine()跨平台换行。
完整代码示例
import java.io.*;
public class CharOutputDemo {
public static void main(String[] args) {
// 1. FileWriter 基础写入
try (FileWriter fw = new FileWriter("output.txt")) {
fw.write("Hello World");
fw.write("\nJava IO学习");
} catch (IOException e) {
e.printStackTrace();
}
// 2. 转换流 指定编码
try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8")) {
osw.write("指定UTF-8编码写入");
} catch (IOException e) {
e.printStackTrace();
}
// 3. BufferedWriter 缓冲按行写入
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write("第一行内容");
bw.newLine();
bw.write("第二行内容");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. Writer 五大写入方法(表格 + 代码)
| 方法签名 | 功能说明 |
|---|---|
write(int c) |
写入单个字符 |
write(char[] cbuf) |
写入整个字符数组 |
write(char[] cbuf,int off,int len) |
从数组 off 位置开始,写入 len 个字符 |
write(String str) |
写入整个字符串 |
write(String str,int off,int len) |
写入字符串部分内容 |
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterMethodDemo {
public static void main(String[] args) {
try (Writer writer = new FileWriter("writer_demo.txt")) {
writer.write('H');
char[] arr = {'e','l','l','o'};
writer.write(arr);
writer.write(arr,1,2);
writer.write(" World!");
String s = "\nThis is Java IO";
writer.write(s,0,11);
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、字节流体系(InputStream / OutputStream)
1. 字节流特点
- 一切文件都能用字节流读写
- 字符流只能文本,字节流通用所有文件
2. 字节输入流 InputStream
常用核心方法:
read()读单个字节,末尾返回-1read(byte[] b)批量读入字节数组read(byte[] b,int off,int len)读指定长度close()关闭流释放资源
常用实现类:FileInputStream
代码示例
import java.io.*;
public class ByteInputDemo {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("test.txt")) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
System.out.print(new String(buffer,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 字节输出流 OutputStream
常用实现类:FileOutputStream
代码示例
import java.io.*;
public class ByteOutputDemo {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("byte_output.txt")) {
fos.write("中国人\r\n".getBytes());
fos.write("ABCDEFG".getBytes(),2,4);
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、IO 流分类总表(汇总背诵版)
| 流类型 | 抽象基类 | 常用实现类 | 适用场景 |
|---|---|---|---|
| 字符输入流 | Reader | FileReader、InputStreamReader、BufferedReader | 读取文本 |
| 字符输出流 | Writer | FileWriter、OutputStreamWriter、BufferedWriter | 写入文本 |
| 字节输入流 | InputStream | FileInputStream、BufferedInputStream | 图片 / 视频 / 任意文件读 |
| 字节输出流 | OutputStream | FileOutputStream、BufferedOutputStream | 图片 / 视频 / 任意文件写 |
五、重点补充
-
资源关闭IO 流占用系统资源,必须关闭;推荐 try-with-resources,自动关闭流,不用手动写
close()。 -
缓冲流优势Buffered 开头的缓冲流:内置缓冲区,减少磁盘 IO 次数,读写效率远高于普通流。
-
转换流核心作用
InputStreamReader / OutputStreamWriter
- 字节流 ↔ 字符流 桥梁
- 可手动指定编码,解决中文乱码问题
- 使用场景硬性规则
- 文本文件:优先 字符流
- 图片、视频、音频、压缩包:必须用 字节流
- 禁止用字符流解析二进制文件,会损坏数据
- 换行区别
BufferedWriter.newLine():跨平台通用换行\n只适合 Linux,\r\n适合 Windows
- 文件写入覆盖与追加
new FileWriter("a.txt",true)/new FileOutputStream("a.txt",true)第二个参数为 true:追加写入,不覆盖原文件。
更多推荐


所有评论(0)