格式化流
实现格式化的流对象是PrintWriter(字符流类)或PrintStream(字节流类)的实例。
你可能需要的唯一PrintStream对象是System.out和System.err(有关这些对象的更多信息,请参阅命令行中的I/O),当你需要创建格式化的输出流时,请实例化PrintWriter,而不是PrintStream。
与所有字节和字符流对象一样,PrintStream和PrintWriter的实例实现了一组标准的write方法,用于简单的字节和字符输出,此外,PrintStream和PrintWriter都实现了将内部数据转换为格式化输出的相同的一组方法,提供两个级别的格式:
print和println以标准方式格式化各个值。
format基于格式字符串格式化几乎任意数字值,具有许多用于精确格式化的选项。
print和println方法使用适当的toString方法转换值后,调用print或println会输出单个值,我们可以在Root示例中看到这一点:
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的输出:
The square root of 2 is 1.4142135623730951. The square root of 5 is 2.23606797749979.
i和r变量格式化两次:第一次使用print重载方法的代码,第二次通过Java编译器自动生成的转换代码,其使用toString,你可以通过这种方式格式化任何值,但你无法控制结果。
format方法format方法根据格式字符串格式化多个参数,格式字符串由嵌入格式说明符的静态文本组成,除格式说明符外,格式字符串输出不变。
格式字符串支持许多功能,在本教程中,我们将介绍一些基础知识,有关完整说明,请参阅API规范中的格式字符串语法。
Root2示例使用单个format调用格式化两个值:
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个字符的转换结束,该转换指定生成的格式化输出类型,这里使用的三个转换是:
d将整数值格式化为十进制值。
f将浮点值格式化为十进制值。
n输出特定于平台的行结束符。
以下是其他一些转换:
x将整数格式化为十六进制值。
s将任何值格式化为字符串。
tB将整数格式化为特定于语言环境的月份名称。
还有很多其他转换。
除%%和%n外,所有格式说明符必须匹配一个参数,如果不这样做,则抛出异常。在Java编程语言中, 转义符始终生成换行符(u000A),除非你特别需要换行符,否则请勿使用 ,要获取本地平台的正确行分隔符,请使用%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
附加元素都是可选的,下图显示了较长的说明符如何分解为元素。
元素必须按所示顺序出现,从右侧开始,可选元素是:
Precision,对于浮点值,这是格式化值的数学精度,对于s和其他常规转换,这是格式化值的最大宽度,如有必要,该值将被截断。
Width,格式化值的最小宽度,如有必要,将填充该值,默认情况下,该值使用空格填充。
Flags,指定其他格式选项,在Format示例中,+标志指定应始终使用符号格式化数字,0标志指定0是填充字符。其他标志包括 — (在右边填充)和(带有特定于语言环境的千位分隔符的格式号),请注意,某些标志不能与某些其他标志一起使用或与某些转换一起使用。
Argument Index,参数索引允许你显式匹配指定的参数,你还可以指定<以匹配与前一个说明符相同的参数,因此,这个例子可以写为:System.out.format("%f, %<+020.10f %n", Math.PI);
上一篇:扫描 下一篇:命令行I/O文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72963.html
Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...
字符流 Java平台使用Unicode约定存储字符值,字符流I/O自动将此内部格式与本地字符集进行转换,在Western语言环境中,本地字符集通常是ASCII的8位超集。 对于大多数应用程序,具有字符流的I/O并不比具有字节流的I/O复杂,使用流类完成的输入和输出会自动转换为本地字符集和从本地字符集转换,使用字符流代替字节流的程序会自动适应本地字符集并为国际化做了准备 — 所有这些都无需程序员的额...
缓冲流 到目前为止,我们看到的大多数示例都使用无缓冲的I/O,这意味着每个读取或写入请求都由底层操作系统直接处理,这可以使程序效率低得多,因为每个这样的请求通常触发磁盘访问、网络活动或一些相对昂贵的其他操作。 为了减少这种开销,Java平台实现了缓冲的I/O流,缓冲输入流从称为缓冲区的内存区读取数据,仅当缓冲区为空时才调用原生输入API,类似地,缓冲输出流将数据写入缓冲区,并且仅在缓冲区已满时才调...
扫描 编程I/O通常涉及转换人们喜欢使用的整齐格式的数据,为了帮助你完成这些工作,Java平台提供了两个API,扫描器API将输入分解为与数据位相关联的单个标记,格式化API将数据组装成格式良好、可读的形式。 Scanner类型的对象对于将格式化输入分解为标记并根据其数据类型转换单个标记非常有用。 将输入分解为标记 默认情况下,扫描器使用空格分隔标记(空格字符包括空格、制表符和行终止符,有关完整列...
命令行I/O 程序通常从命令行运行,并在命令行环境中与用户交互,Java平台以两种方式支持这种交互:通过标准流和控制台。 标准流 标准流是许多操作系统的一个特性,默认情况下,它们从键盘读取输入并将输出写入显示器,它们还支持文件和程序之间的I/O,但该功能由命令行解释器控制,而不是程序。 Java平台支持三种标准流:标准输入,可通过System.in访问;标准输出,可通过System.out访问;和...
阅读 1107·2021-11-23 09:51
阅读 1073·2021-10-18 13:31
阅读 2965·2021-09-22 16:06
阅读 4256·2021-09-10 11:19
阅读 2195·2019-08-29 17:04
阅读 424·2019-08-29 10:55
阅读 2471·2019-08-26 16:37
阅读 3368·2019-08-26 13:29