java - 关于Java I/O类的问题

标签 java inheritance java-io

我正在阅读本关于 Java 网络(客户端/服务器)的教程,我有一个关于我不明白的问题。

https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html

我经常看到这种情况

BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

BufferedReader inputStream = new BufferedReader(new FileReader("xanadu.txt"));
PrintWriter outputStream = new PrintWriter(new FileWriter("characteroutput.txt"));

我知道 BufferReader 的构造函数是

BufferedReader(Reader in)

1) 我还知道,由于 InputStreamReader 是由 Reader 类继承的,因此您可以通过 BufferedReader 构造函数传递它。但我的问题是为什么我们需要InputStreamReader?是因为InputStreamReader可以保存输入流(根据API中的构造函数)

编辑:我犯了一个错误,请忽略此

<删除> 2)现在下一部分,inputStream和outputStream(根据API)是从Object类继承的。如何将这两个类分别分配为 BufferedReader 和 PrintWriter。这是因为它们都是由对象类继承的,还是有其他原因?因为如果是这种情况,谁会知道您可以将什么分配为类,就好像所有内容都假定由 Objects 类继承一样。

3)最后但并非最不重要的一点是,关于 BufferedReader 和 PrintWriter 的另一个问题

BufferedReader inputStream = new BufferedReader(new FileReader("xanadu.txt"));
PrintWriter outputStream = new PrintWriter(new FileWriter("characteroutput.txt"));

为什么这两个类选择传递 FileReader 和 FileWriter 类的引用?

我想我想要更多关于为什么选择这些特定类别的信息。

提前致谢!

最佳答案

1) 要构造 BufferedReader,您需要一个 Reader 参数。 System.in 不是 Reader。 Java IO 难题的每个部分只做一件事:InputStreamReaderInputStream 获取一个 Reader,然后 BufferedReader > 缓冲 Reader

2)他们不能,正是因为#1。首先,将 InputStream 包装在 ReaderWriter 包装器中,然后您可以执行其他操作。

3) 因为它们正在读取/写入文件,而不是流。 (编辑:并且,正如 pvg 在评论中提到的,inputStream = new BufferedReader(...)outputStream = new PrintWriter(...) 是极其令人困惑的变量名称。 )

<小时/>

基本上,它就像一个制造商。您有System.in,它是一个InputStream。这意味着他正在向您提供纯字节。你不需要纯字节;您想要给定字符(即通过某种字符编码解析的字节,例如 UTF-8)。但 InputStream 不知道如何做到这一点。

输入InputStreamReader。作为每一位读者,他知道如何为您提供角色。具体来说,InputStreamReader 知道如何从 InputStream 获取字节并将其作为字符传递。所以你把他放在System.in前面,这样你就不用和他打交道了。

但是您不想一次获得每个角色。你想要更多。您希望能够一次阅读整行!你想要...一个缓冲区!输入 BufferedReader:他站在另一个 Reader 前面,收集每个角色并将其藏起来,直到您要求其中一些为止。

要准确地了解发生了什么,您需要了解基于字节的 IO 和基于文本的 IO 之间的关键区别,并研究每个类的构造函数以准确了解它包装的是什么样的东西(尽管名称是一个很好的提示)。

关于java - 关于Java I/O类的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31377651/

相关文章:

java - 如何有效且高效地重构遗留代码?

reactjs - React 中组合优于继承的好处

java - 系统找不到指定的文件,但文件存在

java - 复制带锁的文件

java - 如何映射可以具有不同类型并从另一个类扩展的请求对象数据?

java - Java读取大文件时如何避免OutOfMemory异常

java - 树集比较器

java - 如何在方法中使用类类型泛型

java - 注释非法的 Unicode 序列

c++ - 序列化多态指针的QVector