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

mor*_*ort 1 java tcp stream

如果这是一个好或坏的想法,我只是在徘徊:

InputStreamReader in = new InputStreamReader(socket.getInputStream());
BufferedReader reader = new BufferedReader(in);
DataInputStream dis = new DataInputStream(in);
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ten 5

(我认为你的例子在读者是什么以及什么是输入流方面被打破了,但我仍然得到了问题)

您可以执行此类操作,但您需要确切了解每个组件在缓冲方面的行为方式.

您正在使用的套接字输入流只允许您读取一个字节一次(checkout InputStream.markSupported()).您可以将该输入流包装在BufferedInputStream有效读取前面的一些字节中,但也添加了执行a mark()reset().的功能.

这意味着在顶部的任何读取器/输入流BufferedInputStream可以预读,标记,快退等,但在这里,你必须小心,这样你就不会增加"缓冲区"的另一层-即BufferedReader> InputStreamReader> BufferedInputStream> InputStream.

所以答案是肯定的,可以让它起作用,只要知道每个组件的确切行为(我经常看到人们BufferedXXX为了它的地狱而投入).

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

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