关于Java的I/O类的问题

Tan*_*ers 0 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()));
Run Code Online (Sandbox Code Playgroud)

BufferedReader inputStream = new BufferedReader(new FileReader("xanadu.txt"));
PrintWriter outputStream = new PrintWriter(new FileWriter("characteroutput.txt"));
Run Code Online (Sandbox Code Playgroud)

我知道BufferReader的构造函数是

BufferedReader(Reader in)
Run Code Online (Sandbox Code Playgroud)

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

编辑:我犯了错误,请忽略这一点

2)现在对于下一部分,inputStream&outputStream(根据API)继承自Object类.如何将这两个类分别分配为BufferedReader和PrintWriter.这是因为它们都是由对象类继承的,还是它们的另一个原因?因为如果是这种情况,怎么会有人知道你可以分配什么作为类,好像所有东西都被Object类继承.

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

BufferedReader inputStream = new BufferedReader(new FileReader("xanadu.txt"));
PrintWriter outputStream = new PrintWriter(new FileWriter("characteroutput.txt"));
Run Code Online (Sandbox Code Playgroud)

为什么那两个类,选择通过FileReader和FileWriter类的引用?

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

提前致谢!

Ama*_*dan 6

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

2)他们不能,正是因为#1.首先你包装InputStream一个ReaderWriter包装,然后你可以做其他的东西.

3)因为他们正在读取/写入文件,而不是流.(编辑:并且,正如评论中提到的pvg,inputStream = new BufferedReader(...)并且outputStream = new PrintWriter(...)变量名称非常混乱.)


基本上,它就像一个制造商.你有System.in,这是一个InputStream.这意味着他正在交给你简单的字节.你不想要普通的字节; 你希望被赋予字符(即由某些字符编码解析的字节,例如UTF-8).但InputStream不知道该怎么做.

输入InputStreamReader.每个人都Reader知道如何给你角色.具体InputStreamReader知道如何从a获取字节InputStream并将其作为字符移交.所以你把他排在了前面System.in,所以你不必和他打交道.

但是你不希望一次获得一个角色.你想要更多.您希望能够一次读取整行!你想......一个缓冲区!输入BufferedReader:他是那个站在另一个人面前的人Reader,收集每个角色并仓鼠离开,直到你要求一些.

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