24. Java IO: Reader-Writer && Java IO: PrintWriter

来源:互联网 发布:管道安装设计软件 编辑:程序博客网 时间:2024/05/12 10:37

Java IO: Reader

在java IO API里,Java Reader类(java.io.Reader)是所有Reader子类的基类。Reader像InputStream一样,除了它是基于字符而不是基于字节。换句话说,Java Reader用于读写文本,而InputStream是用于读取原始字节。

Unicode格式字符

在今天,许多应用用UTF(UTF-8或UTF-16)来储存文本数据。UTF-8格式需要花费一个或更多字节来表示一个字符。UTF-16需要花费2个字节来表示一个字符。因此,当读取文本数据时,UTF格式的数据中一个字节可能不是与一个字符相关。如果你从输入流里每次只读UTF-8数据中的一个字节,试着将每个字节转换成字符,你可能最终获得你不是你期望的文本。

为了解决这个问题,我们有Reader类。Reader类有将字节解码为字符的能力的。你需要告诉Reader字符设置的解码格式。当你初始化Reader时(实际上,档子初始化Reader中的一个基类)就完成了。

用Reader读取字符

Reader的read()方法返回一个int值,它包含了下一个读取的字符的char值。如果read()方法返回-1,在reader里没有更多的数据了,可以关闭它。确切的说,-1是int值,不是字节或字符值。这里是有区别的。

Reader子类

通常你用Reader的子类而不是直接用Reader.Java IO包含很多Reader子类。例如,InputStreamReader, CharArrayReader, FileReader和其他的。预览所有Reader子类,查看Java IO教程–概览 。

Reader和输入源

Reader通常连接像文件、字符数组、网络socke等等数据源。在Java IO教程–概览也有详细信息。

Java IO: Writer

在java IO API里,Java Writer类(java.io.Writer)是所有Writer子类的基类。Writer像OutputStream一样,除了它是基于字符而不是基于字节。换句话说,Java Writer用于写文本,而OutputStream是用于写入原始字节。

Unicode格式字符

在今天,许多应用用UTF(UTF-8或UTF-16)来储存文本数据。UTF-8格式需要花费一个或更多字节来表示一个字符。UTF-16需要花费2个字节来表示一个字符。为了正确地写UTF-8或UTF-16,你需要知道两种格式中的哪一个是想要存入文本,你需要知道如何正确地用已选的格式编码字符。

这就是Writer类方便的地方。Java Writer子类通常可以为你处理UTF-8和UTF-16编码,所以你不需要担心。

Writer子类

通常你用Writer的子类而不是直接用Writer.Java IO包含很多Writer子类。例如, OutputStreamWriter, CharArrayWriter, FileWriterr和其他的。预览所有Reader子类,查看[Java IO教程–概览]

Writers和输出终点

Writers通常连接像文件、字符数组、网络socke等等数据输出终点。在Java IO教程–概览也有详细信息。

Java IO: PrintWriter

Java PrintWriter类可以使你将格式化的数据写到底层的Write.例如,将int ,long和其他原始数据像文本一样格式化写入,而不是像他们的字节值。

如果你在生成报告,这个报告里混合了文本和号码,Java Printer这是就很有用。除了写原始字节的方法,PrintWriter和PrintStream一样有所有相同的方法。作为Writer的子类,PrintWriter类目的是用于写入文本。

PrintWriter例子

例如:

FileWriter  writer      = new FileWriter("d:\\data\\report.txt");PrintWriter printWriter = new PrintWriter(writer);printWriter.print(true);printWriter.print((int) 123);printWriter.print((float) 123.456);printWriter.printf(Locale.UK, "Text + data: %1$", 123);printWriter.close();

这个例子首先创建了PrintWriter 实例,用于连接FileWriter。第二,例子向PrintWriter写了一个布尔值,一个int值和一个float值。第三,例子调用了PrintWriter的高级的printf()方法,可将格式化的号码以文本字符串插入。自后关闭PrintWriter 。

PrintWriter Constructors

PrintWriter有一大推可选择的构造方法。可以使你连接文件、输出流或writer.Writer子类有许多构造方法,可以像参数一样传入其他Writer实例,这种方式下,和PrintWriter是有一点不同的。

Java PrintWriter包含强大的print()和 format()方法。这两个方法实际上有一样的功能,但是和C语言的“printf”更相似。用格式化的字符串,print()和 format()方法允许你以更高级的方式混合文本和数据。看这个链接获取更多关于print()和 format()方法的信息。

Closing a PrintWriter

当你完成向 Java PrintWrite里写入字符,你该记得关闭它。关闭PrintWriter的同时也关闭了PrintWriter 正在用于写数据的Writer实例。
通过调用它的close()方法可以关闭PrintWriter。例如:

printWriter.close();

你也在java7下用try-with-resources构造块。例如:

FileWriter writer = new FileWriter("data/report.txt");try(PrintWriter printWriter =    new PrintWriter(writer)){    printWriter.write("Hello World ");    printWriter.write((int)123);

注意不再有任何直接的close()方法调用。try-with-resources构造块包含这些。

注意FileWriter 实例也没在try-with-resources块里创建。这意味着try-with-resources块不会自动关闭这个FileWriter实例。然而,当PrintWriter关闭了,它也将关闭它写入数据的OutputStream ,所以当PrintWriter 关闭后,这个FileWriter 实例也将关闭。

0 0
原创粉丝点击