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中的构造函数)
编辑:我犯了错误,请忽略这一点
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类的引用?
我想我想要更多关于为什么选择这些特定类的信息.
提前致谢!
1)要构造BufferedReader,您需要一个Reader参数.System.in不是Reader.Java IO难题的每个部分只做一件事:从InputStreamReadera中获取,然后缓冲它.ReaderInputStreamBufferedReaderReader
2)他们不能,正是因为#1.首先你包装InputStream一个Reader或Writer包装,然后你可以做其他的东西.
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之间的关键区别,并研究每个类的构造函数,以确切地了解它所包含的内容(尽管名称是一个很好的提示) .