实现格式化的流对象是PrintWriter(字符流类)或PrintStream(字节流类)的实例。html
你可能须要的惟一PrintStream
对象是 System.out和 System.err(有关这些对象的更多信息,请参阅 命令行中的I/O),当你须要建立格式化的输出流时,请实例化PrintWriter
,而不是PrintStream
。
与全部字节和字符流对象同样,PrintStream
和PrintWriter
的实例实现了一组标准的write
方法,用于简单的字节和字符输出,此外,PrintStream
和PrintWriter
都实现了将内部数据转换为格式化输出的相同的一组方法,提供两个级别的格式:java
print
和println
以标准方式格式化各个值。format
基于格式字符串格式化几乎任意数字值,具备许多用于精确格式化的选项。print
和println
方法使用适当的toString
方法转换值后,调用print
或println
会输出单个值,咱们能够在Root示例中看到这一点:git
public class Root { public static void main(String[] args) { int i = 2; double r = Math.sqrt(i); System.out.print("The square root of "); System.out.print(i); System.out.print(" is "); System.out.print(r); System.out.println("."); i = 5; r = Math.sqrt(i); System.out.println("The square root of " + i + " is " + r + "."); } }
这是Root
的输出:github
The square root of 2 is 1.4142135623730951. The square root of 5 is 2.23606797749979.
i
和r
变量格式化两次:第一次使用print
重载方法的代码,第二次经过Java编译器自动生成的转换代码,其使用toString
,你能够经过这种方式格式化任何值,但你没法控制结果。编程
format
方法根据格式字符串格式化多个参数,格式字符串由嵌入格式说明符的静态文本组成,除格式说明符外,格式字符串输出不变。segmentfault
格式字符串支持许多功能,在本教程中,咱们将介绍一些基础知识,有关完整说明,请参阅API规范中的格式字符串语法。api
Root2示例使用单个format
调用格式化两个值:oracle
public class Root2 { public static void main(String[] args) { int i = 2; double r = Math.sqrt(i); System.out.format("The square root of %d is %f.%n", i, r); } }
这是输出:编程语言
The square root of 2 is 1.414214.
与本例中使用的三个格式说明符同样,全部格式说明符都以%
开头,以1或2个字符的转换结束,该转换指定生成的格式化输出类型,这里使用的三个转换是:spa
d
将整数值格式化为十进制值。f
将浮点值格式化为十进制值。n
输出特定于平台的行结束符。如下是其余一些转换:
x
将整数格式化为十六进制值。s
将任何值格式化为字符串。tB
将整数格式化为特定于语言环境的月份名称。还有不少其余转换。
除%%
和%n
外,全部格式说明符必须匹配一个参数,若是不这样作,则抛出异常。在Java编程语言中,
\n
转义符始终生成换行符(\u000A
),除非你特别须要换行符,不然请勿使用\n
,要获取本地平台的正确行分隔符,请使用%n
。
除了转换以外,格式说明符还能够包含几个额外元素,以进一步自定义格式化输出,这里有一个例子,Format,它使用了全部可能的元素类型。
public class Format { public static void main(String[] args) { System.out.format("%f, %1$+020.10f %n", Math.PI); } }
这是输出:
3.141593, +00000003.1415926536
附加元素都是可选的,下图显示了较长的说明符如何分解为元素。
元素必须按所示顺序出现,从右侧开始,可选元素是:
s
和其余常规转换,这是格式化值的最大宽度,若有必要,该值将被截断。Format
示例中,+
标志指定应始终使用符号格式化数字,0
标志指定0
是填充字符。其余标志包括 — (在右边填充)和(带有特定于语言环境的千位分隔符的格式号),请注意,某些标志不能与某些其余标志一块儿使用或与某些转换一块儿使用。<
以匹配与前一个说明符相同的参数,所以,这个例子能够写为:System.out.format("%f, %<+020.10f %n", Math.PI);