我正在尝试创建一个以SocketInputStream
形式获取InputStream
的示例。不支持 reset()
和 mark()
。现在,一旦我处理这个输入流,我就可以再次处理它以进行其他操作,因为它已关闭,到达 eof。
就像我想将此过程用于 InputStream
一样,它允许 reset()
和 markSupported()
。
在这种情况下我该如何处理InputStream
。
最佳答案
显然,默认情况下 SocketInputStream
不支持mark()
和reset()
。网络流不是可以重新定位的东西。没有任何东西存储已读取的字节,因此流永远不会返回。
也就是说,您可以扩展 SocketInputStream
并提供该功能。您需要覆盖 SocketInputStream.read(byte b[], int off, int length)
方法并将信息存储在 ByteArrayOutputStream
中或其他正在运行的byte[]
。每当标记重新定位时,您都需要从 byte[]
读取内容。只发出super.read(...)
如果您位于内部数组的末尾。
然而,要正确完成这项工作是一项艰巨的工作,并且您必须非常小心这里的内存。
关于java - 支持 Reset() 或 MarkSupported() 的 SocketInputStream 和 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12647183/