java中控制台输出优先使用system.out(字节流printstream),因其简洁可靠、自动编码和刷新;需严格控编码时才用outputstreamwriter包装为字符流。

Java 中字节流和字符流都可以将数据输出到控制台,但它们的使用方式和适用场景不同。控制台(System.out)本质上是字节流(PrintStream),但它被设计成能直接处理字符(如 print("hello")),所以实际开发中更常用字符流的封装形式或直接用 System.out。
字节流输出到控制台
字节流以 OutputStream 为基类,控制台对应的字节输出流是 System.out(类型为 PrintStream,是 FilterOutputStream 的子类)。它可以直接写入字节或自动转换字符串:
-
System.out.write(int b):写入单个字节(注意:会把 int 截断为低 8 位,且不换行、不自动刷新) -
System.out.write(byte[] b):写入字节数组 - 更常用的是它的高级方法:
print()、println()、printf(),这些是PrintStream提供的便捷接口,内部做了字符编码(默认平台编码,如 UTF-8 或 GBK)和缓冲处理
示例:
System.out.write('A'); // 输出 A(字节 65)
System.out.write("\n".getBytes()); // 手动换行(不推荐,编码依赖平台)
System.out.println("Hello"); // 推荐:自动编码 + 换行 + 刷新
字符流输出到控制台
字符流以 Writer 为基类,不能直接操作 System.out(它是字节流),但可以包装它来构建字符流:
- 使用
OutputStreamWriter将System.out转为字符流,并指定字符编码(推荐显式指定,避免乱码) - 再套一层
BufferedWriter提升性能(可选) - 调用
write(String)、newLine()、flush()等方法
示例:
Writer writer = new OutputStreamWriter(System.out, "UTF-8");
writer.write("你好,世界!");
writer.newLine();
writer.flush(); // 注意:不 flush 可能不立即显示
为什么通常直接用 System.out 而不手动包装字符流?
System.out 是 PrintStream,它已经具备字符处理能力(重载了各种 print 方法),且默认使用平台编码。对大多数控制台输出场景来说,它足够简洁可靠:
- 自动处理字符串编码(虽然编码不可控,但一般与终端匹配)
- 自带缓冲,且
println会自动flush - 支持格式化输出(
printf)、对象自动toString()调用 - 无需手动管理
close()(System.out不应关闭)
注意事项
- 不要调用
System.out.close(),否则后续输出失效,且无法恢复 - 跨平台时,若需严格控制编码(比如确保 UTF-8),建议用
OutputStreamWriter显式指定;否则依赖System.getProperty("file.encoding") -
PrintStream的print系列方法不会抛出IOException(异常被静默吞掉),而Writer的write会,需 try-catch 或 throws - 控制台不是文件,不涉及磁盘 I/O,所以性能差异在控制台场景下几乎不可测,优先选可读性和安全性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











