系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类 (2)

同 InputStreamReader,OutputStreamWriter 也可以使用指定的字符集输出,如:
Writer outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");

关闭 OutputStreamReader

参考关闭 InputStreamReader 或 Java IO 异常处理。

读写文件 FileReader/FileWriter FileReader

FileReader类使得可以将文件的内容作为字符流读取。 它的工作方式与 FileInputStream 非常相似,只是 FileInputStream 读取字节,而 FileReader 读取字符。 换句话说,FileReader 旨在读取文本。 取决于字符编码方案,一个字符可以对应于一个或多个字节。

FileReader 假定您要使用运行应用程序的计算机的默认字符编码来解码文件中的字节。 这可能并不总是你想要的,但是不能改变它!
如果要指定其他字符解码方案,请不要使用 FileReader 。 而是在 FileInputStream 上使用 InputStreamReader 。 InputStreamReader 允许您指定在读取基础文件中的字节时使用的字符编码方案。

FileWriter

FileWriter 类可以将字符写入文件。 在这方面它的工作原理与 FileOutputStream 非常相似,只是 FileOutputStream 是基于字节的,而 FileWriter 是基于字符的。 换句话说,FileWriter 用于写文本。 一个字符可以对应于一个或多个字节,这取决于使用的字符编码方案。
创建 FileWriter 时,可以决定是否要覆盖具有相同名称的任何现有文件,或者只是要追加内容到现有文件。 可以通过选择使用的 FileWriter 构造函数来决定。

FileWriter(File file, boolean append) :根据给定的 File 对象构造一个 FileWriter 对象。 示例如下:

Writer fileWriter = new FileWriter("c:\\data\\output.txt", true); // 追加模式 Writer fileWriter = new FileWriter("c:\\data\\output.txt", false); // 默认情况,直接覆盖原文件

注意,只要成功 new 了一个 FileWriter 对象,没有指定是追加模式的话,那不管有没有调用 write() 方法,都会清空文件内容。

下面是一个读和写的例子:

public class FileRW { public static void main(String[] args) throws IOException { // 默认是覆盖模式 File file = new File("D:\\test\\1.txt"); Writer writer1 = new FileWriter(file); writer1.write("string from writer1, "); writer1.close(); Writer writer2 = new FileWriter(file, true); writer2.write("append content from writer2"); writer2.close(); Reader reader = new FileReader(file); int data = reader.read(); while (data != -1) { // 将会输出 string from writer1, append content from writer2 System.out.print((char) data); data = reader.read(); } reader.close(); } }

注意:为清楚起见,此处已跳过正确的异常处理。 要了解有关正确异常处理的更多信息,请转至Java IO异常处理。

其他行为和 InputStreamReader 差不多,就不展开讲了。

PipedReader/PipedWriter 读写管道 PipedReader 和 PipedWriter

PipedReader 类使得可以将管道的内容作为字符流读取。 因此它的工作方式与 PipedInputStream 非常相似,只是PipedInputStream 是基于字节的,而不是基于字符的。 换句话说,PipedReader 旨在读取文本。PipedWriter 同理。

构造器 方法 描述
PipedReader()   创建尚未连接的 PipedReader。  
PipedReader(int pipeSize)   创建一个尚未连接的 PipedReader,并对管道缓冲区使用指定的管道大小。  
PipedReader(PipedWriter src)   创建直接连接到传送 PipedWriter src 的 PipedReader。  
PipedReader(PipedWriter src, int pipeSize)   创建一个 PipedReader,使其连接到管道 writer src,并对管道缓冲区使用指定的管道大小。  
PipedWriter()   创建一个尚未连接到传送 reader 的传送 writer。  
PipedWriter(PipedReader snk)   创建传送 writer,使其连接到指定的传送 reader。  
读写之前,必须先建立连接

PipedReader 必须连接到 PipedWriter 才可以读 ,PipedWriter 也必须始终连接到 PipedReader 才可以写。就是说读写之前,必须先建立连接,有两种方式可以建立连接。

通过构造器创建,伪代码如 Piped piped1 = new Piped(piped2);

调用其中一个的 connect() 方法,伪代码如 Piped1.connect(Piped2);

并且通常,PipedReader 和 PipedWriter 由不同的线程使用。 注意只有一个 PipedReader 可以连接到同一个 PipedWriter 。
一个示例如下:

PipedWriter writer = new PipedWriter(); PipedReader reader = new PipedReader(writer); writer.write("string form pipedwriter"); writer.close(); int data = reader.read(); while (data != -1) { System.out.print((char) data); // string form pipedwriter data = reader.read(); } reader.close();

注意:为清楚起见,这里忽略了正确的 IO 异常处理,并且没有使用不同线程,不同线程操作请参考 PipedInputStream 。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyxsy.html