java - 使用一个 InputStream 作为多个更高级别 InputStream(如 BufferedReader、DataInputStream)的源

标签 java tcp stream

我只是在犹豫这是好主意还是坏主意:

InputStreamReader in = new InputStreamReader(socket.getInputStream());
BufferedReader reader = new BufferedReader(in);
DataInputStream dis = new DataInputStream(in);

现在我想从 BufferedReader 读取数据。如果某个命令(只是一个字符串)到达,我想继续从 DataInputStream 中读取。

这个有用吗?如果是,它被认为是好的还是坏的做法?

最佳答案

(我认为你的例子在什么是阅读器和什么是输入流方面是错误的,但我还是明白了这个问题)

您可以这样做,但您需要准确了解每个组件在缓冲方面的行为。

您正在使用的套接字输入流将只允许您读取某个字节一次(检查 InputStream.markSupported())。您可以将该输入流包装在一个 BufferedInputStream 中,它可以有效地提前读取一些字节,而且还添加了执行 mark()reset() 的功能>.

这意味着 BufferedInputStream 之上的任何读取器/输入流都可以提前读取、标记、向后跳等。但是这里需要小心,不要再添加一层“缓冲区”- 即 BufferedReader > InputStreamReader > BufferedInputStream > InputStream

所以答案是肯定的,它可以工作,只要知道每个组件的确切行为(我经常看到人们投入 BufferedXXX 只是为了它的 hell )。

在你的例子中我会这样做:

BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
InputStreamReader reader = new InputStreamReader(in, "utf-8"); // consider char encoding
DataInputStream dis = new DataInputStream(in);

关于java - 使用一个 InputStream 作为多个更高级别 InputStream(如 BufferedReader、DataInputStream)的源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7865577/

相关文章:

python - 如何将视频流从一个 python 传递到另一个?

.net - 将 blob 存储在 SQL Server 中而不将 blob 读入内存

node.js - 一次读取子进程标准输出 100 个字节

JAVA - 在启动时运行外部 jar 文件

c++ - 调用basic_stream_socket::async_write_some的完成处理程序的条件是什么?

java - Spring集成TCP服务器: Get the Ip address & the payload

http - GOLANG,HTTP 有 "use of closed network connection"错误

java - 无法将客户端值 'null' 转换回服务器端对象

java - 尝试发送 gcm 消息时出现 java.lang.IllegalArgumentException 异常??

java - 配置失败导致 TestNG 中的测试跳过且 XML 中没有信息