在 Java 编程中,System.out.println()
的使用频率恐怕不亚于 main
方法的使用频率。其中,System.out
返回的正是打印流 PrintStream
。除此之外,Java 还提供了另一个打印流 PrintWriter
,它们分别继承自 OutputStream
和 Writer
,一个是字节流,一个是字符流。
1 打印流的特点
打印流具有以下几个特点:
- 自动数据类型转换:打印流可以将各种数据类型转换为字符串,并输出到指定的输出流中。
- 自动换行:打印流可以在输出字符串的末尾自动添加换行符,方便输出多个字符串时的格式控制。
- 输出到控制台或文件:打印流可以将数据输出到控制台或者文件中,方便调试和日志记录(尽管生产环境下更推荐使用 Logback、ELK 等)。
2. PrintStream
类常用方法
PrintStream
类提供了以下常用方法:
print()
:输出一个对象的字符串表示形式。println()
:输出一个对象的字符串表示形式,并在末尾添加一个换行符。printf()
:使用指定的格式字符串和参数输出格式化的字符串。
2.1 示例
PrintStream ps = System.out;
ps.println("沉默王二");
ps.print("沉 ");
ps.print("默 ");
ps.print("王 ");
ps.print("二 ");
ps.println();ps.printf("姓名:%s,年龄:%d,成绩:%f", "沉默王二", 18, 99.9);
在这个示例中,我们创建了一个 PrintStream
对象 ps
,它输出到控制台。我们使用 ps
的 print
和 println
方法输出了一些字符串。使用 printf
方法输出了一个格式化字符串,其中 %s
、%d
和 %f
分别表示字符串、整数和浮点数的格式化输出。
3 printf 方法详解
printf
方法的签名如下:
public PrintStream printf(String format, Object... args);
其中,format
参数是格式化字符串,args
参数是要输出的参数列表。格式化字符串包含了普通字符和转换说明符。普通字符是指除了转换说明符之外的字符,它们在输出时直接输出。转换说明符是由百分号(%)和一个或多个字符组成的,用于指定输出的格式和数据类型。
3.1 常用转换说明符
%s
:输出一个字符串。%d
或%i
:输出一个十进制整数。%x
或%X
:输出一个十六进制整数,%x
输出小写字母,%X
输出大写字母。%f
或%F
:输出一个浮点数。%e
或%E
:输出一个科学计数法表示的浮点数,%e
输出小写字母e
,%E
输出大写字母E
。%g
或%G
:输出一个浮点数,自动选择%f
或%e/%E
格式输出。%c
:输出一个字符。%b
:输出一个布尔值。%h
:输出一个哈希码(16进制)。%n
:换行符。
3.2 修饰符
除了转换说明符之外,printf
方法还支持一些修饰符,用于指定输出的宽度、精度、对齐方式等。
- 宽度修饰符:用数字指定输出的最小宽度,如果输出的数据不足指定宽度,则在左侧或右侧填充空格或零。
- 精度修饰符:用点号(
.
)和数字指定浮点数或字符串的精度,对于浮点数,指定小数点后的位数,对于字符串,指定输出的字符数。 - 对齐修饰符:用减号(
-
)或零号(0
)指定输出的对齐方式,减号表示左对齐,零号表示右对齐并填充零。
3.3 示例
int num = 123;
System.out.printf("%5d\n", num); // 输出 " 123"
System.out.printf("%-5d\n", num); // 输出 "123 "
System.out.printf("%05d\n", num); // 输出 "00123"double pi = Math.PI;
System.out.printf("%10.2f\n", pi); // 输出 " 3.14"
System.out.printf("%-10.4f\n", pi); // 输出 "3.1416 "String name = "沉默王二";
System.out.printf("%10s\n", name); // 输出 " 沉默王二"
System.out.printf("%-10s\n", name); // 输出 "沉默王二 "
具体来说,
- 使用
%5d
来指定输出的整数占据 5 个字符的宽度,不足部分在左侧填充空格。 - 使用
%-5d
来指定输出的整数占据 5 个字符的宽度,不足部分在右侧填充空格。 - 使用
%05d
来指定输出的整数占据 5 个字符的宽度,不足部分在左侧填充 0。 - 使用
%10.2f
来指定输出的浮点数占据 10 个字符的宽度,保留 2 位小数,不足部分在左侧填充空格。 - 使用
%-10.4f
来指定输出的浮点数占据 10 个字符的宽度,保留 4 位小数,不足部分在右侧填充空格。 - 使用
%10s
来指定输出的字符串占据 10 个字符的宽度,不足部分在左侧填充空格。 - 使用
%-10s
来指定输出的字符串占据 10 个字符的宽度,不足部分在右侧填充空格。
4 PrintWriter
PrintWriter
是 Writer
的子类,用于处理字符流。它提供了与 PrintStream
类似的方法,但更适合处理字符数据。
4.1 示例
PrintWriter writer = new PrintWriter(new FileWriter("output.txt"));
writer.println("沉默王二");
writer.printf("他的年纪为 %d.\n", 18);
writer.close();
在这个示例中,我们创建了一个 PrintWriter
对象,它的构造函数接收一个 Writer
对象作为参数。我们使用 FileWriter
来创建一个输出文件流,并将其作为参数传递给 PrintWriter
的构造函数。然后,我们使用 PrintWriter
的 println
和 printf
方法来输出两行内容。最后,我们调用 PrintWriter
的 close
方法来关闭输出流。
我们也可以不创建 FileWriter
对象,直接指定文件名:
PrintWriter pw = new PrintWriter("output.txt");
pw.println("沉默王二");
pw.printf("他的年纪为 %d.\n", 18);
pw.close();
5 小结
打印流在 Java 编程中非常常用,尤其是在调试和日志记录中。PrintStream
和 PrintWriter
提供了方便的方法来输出各种数据类型,并且支持格式化输出。尽管 printf
方法的规则较多,但在实际使用中,我们可以根据需要查阅文档或使用说明,不必死记硬背。通过合理使用打印流,我们可以更高效地进行调试和日志记录。
6 思维导图
7 参考链接
Java 打印流:PrintStream 和 PrintWriter