我正在阅读本关于 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 难题的每个部分只做一件事:InputStreamReader
从 InputStream
获取一个 Reader
,然后 BufferedReader
> 缓冲 Reader
。
2)他们不能,正是因为#1。首先,将 InputStream
包装在 Reader
或 Writer
包装器中,然后您可以执行其他操作。
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/