目录
前言
打印流属于高级流 ,分为处理字节的 PrintStream 和处理字符的 PrintWriter。
有三个特点:
- 打印流只操作文件目的地,不操作数据源。
- 特定的写出方法可以实现数据的原样写出,例如:打印:97 文件中:97
- 特有的写出方法可以实现自动刷新、自动换行。
一、字节打印流
字节流底层没有缓冲区,因此打开自动刷新对效率的影响不大。
1.构造方法
| 构造方法 | 说明 |
|---|---|
| public PrintStream(OutputStream/File/String) | 关联字节输出流/文件/路径 |
| public PrintStream(String fileName, Charset charset) | 指定字符编码 |
| public PrintStream(OutputStream out, boolean autoFlush) | 自动刷新 |
| public PrintStream(OutputStream out, boolean autoFlush, String encoding) | 指定字符编码并刷新 |
2.成员方法
| 成员方法 | 说明 |
|---|---|
| public void write(int b) | 常规写入方法 |
| public void println() | 打印任意数据,自动刷新,自动换行 |
| public void print() | 打印任意数据不换行 |
| public void printf(String format, Object ... args) | 带有占位符的打印语句,不换行 |
3.代码演示
java
public class Test {
public static void main(String[] args) throws FileNotFoundException {
PrintStream ps = new PrintStream(new FileOutputStream("src\\d.txt"), true, Charset.forName("UTF-8"));
ps.println(97);
ps.println(true);
ps.printf("%s 吃 %s", "鱼", "虾");
ps.println();
ps.close();
}
}
运行结果:

二、字符打印流
字符流底层有缓冲区,想要自动刷新需要开启
1.构造方法
| 构造方法 | 说明 |
| public PrintWriter(OutputStream/File/String) | 关联字符输出流/文件/路径 |
| public PrintWriter(String fileName, Charset charset) | 指定字符编码 |
| public PrintWriter(OutputStream out, boolean autoFlush) | 自动刷新 |
| public PrintWriter(OutputStream out, boolean autoFlush, String encoding) | 指定字符编码并刷新 |
|---|
2.成员方法
| 成员方法 | 说明 |
| public void write(int b) | 常规写入方法 |
| public void println() | 打印任意数据,自动刷新,自动换行 |
| public void print() | 打印任意数据不换行 |
| public void printf(String format, Object ... args) | 带有占位符的打印语句,不换行 |
|---|
3.代码演示
java
public class Test {
public static void main(String[] args) throws IOException {
PrintWriter pw = new PrintWriter(new FileWriter("src\\e.txt"));
pw.println("你好你好你好");
pw.close();
}
}
运行结果:

三、打印流的应用场景
我们平时经常使用的System.out其实就是一个字节打印流,指向了本地控制台。


既然 System.out 本质上只是一个指向控制台的 PrintStream,那我们能不能把它改一下,让它指向一个本地文件呢?
java
import java.io.PrintStream;
public class RedirectOutDemo {
public static void main(String[] args) throws Exception {
// 1. 创建一个新的打印流,指向我们指定的日志文件
PrintStream fileOut = new PrintStream("C:\\system_log.txt");
// 2. 把默认打印到屏幕的动作,重定向到我们的 fileOut 流中
System.setOut(fileOut);
// 3. 接下来所有的 System.out.println 都不再显示在屏幕上了
System.out.println("【日志】系统启动成功...");
System.out.println("【日志】连接数据库: localhost:3306");
System.out.println("【日志】发现异常攻击,开始拦截!");
// 记得关闭流
fileOut.close();
}
}
总结
-
不需要捕获异常。
-
println(),什么对象传进去都能原样打印出字符串,还能自动换行。 -
支持格式化 (
printf) 和 自动刷新 (auto-flush)。
😃😃