Java IO流入门:轻松掌握输入输出核心技巧
Java IO流入门:从零开始理解输入输出
一、什么是IO流?
IO就是 Input/Output(输入/输出)的缩写。
你可以把它想象成水流:
输入流(Input):水从外面流进你的杯子里 → 数据从文件/键盘读到程序里
输出流(Output):水从杯子里倒出去 → 数据从程序写到文件/屏幕上
**简单记:**输入 = 读数据,输出 = 写数据。
二、IO流的分类
| 分类 | 说明 | 常见类 |
|---|---|---|
| 字节流 | 以字节(8bit)为单位,能处理任意文件(图片、视频、文本等) | InputStream、OutputStream |
| 字符流 | 以字符为单位,专门处理文本文件 | Reader、Writer |
三、最常用的类
3.1 文件读取:FileReader
import java.io.FileReader;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("test.txt");
int ch;
// read()每次读一个字符,读到末尾返回-1
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行前提: 当前目录下要有 test.txt 文件,里面随便写点内容。
逐行解释:
new FileReader(“test.txt”) → 打开文件,准备读
fr.read() → 每次读一个字符,返回字符的编码值,读完返回 -1
(char) ch → 把数字转成字符打印
fr.close() → 用完记得关闭,不然资源泄漏
3.2 文件写入:FileWriter
import java.io.FileWriter;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter("output.txt");
fw.write("Hello,大一的同学们!\n");
fw.write("IO流没那么难!");
fw.close();
System.out.println("写入成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果: 当前目录下会生成 output.txt,内容就是你写入的文字。
注意:
new FileWriter(“output.txt”) → 如果文件不存在会自动创建;如果存在会覆盖
想追加内容不覆盖?改成 new FileWriter(“output.txt”, true)
3.3 带缓冲的读取:BufferedReader(按行读取)
逐字符读太慢了,BufferedReader 可以一次读一整行:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Demo3 {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
String line;
// readLine()每次读一行,读到末尾返回null
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
为什么要用BufferedReader?
**FileReader:**一个一个字符读,慢
**BufferedReader:**有一块缓冲区,一次读一批,快!而且支持 readLine() 按行读
3.4 带缓冲的写入:BufferedWriter
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Demo4 {
public static void main(String[] args) {
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("output2.txt"));
bw.write("第一行");
bw.newLine(); // 换行
bw.write("第二行");
bw.newLine();
bw.write("第三行");
bw.close();
System.out.println("写入完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、try-with-resources 写法(推荐!)
每次都要手动 close() 太麻烦,这个是自动关闭的写法:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Demo5 {
public static void main(String[] args) {
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();
}
// 不需要写close(),程序自动关闭
}
}
把创建流的代码写在 try() 的小括号里,程序结束时会自动帮你关闭,省心!
五、字节流:处理非文本文件
如果要复制图片、音频等文件,必须用字节流:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo6 {
public static void main(String[] args) {
try (
FileInputStream fis = new FileInputStream("source.jpg");
FileOutputStream fos = new FileOutputStream("copy.jpg")
) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
System.out.println("复制完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
原理: 读一块写一块,就像搬砖一样,一次搬一车,搬完为止。
六、总结
| 场景 | 推荐用的类 |
|---|---|
| 读取文本文件(按行) | BufferedReader + FileReader |
| 写入文本文件(按行) | BufferedWriter + FileWriter |
| 复制图片/音频/视频 | FileInputStream + FileOutputStream |
| 从键盘读取 | Scanner(其实也是IO流的一种) |
核心思路:
1.创建流(打开通道)
2.读取流
3.操作流
4.关闭流(用 try-with-resources 可以省略)
IO流就是这么回事,多写几次代码就熟了!
所有评论(0)