复制输入流的开头

发布于 2024-11-30 21:22:48 字数 178 浏览 2 评论 0 原文

我想复制 InputStream 的“开始”(即前 N 个字符),然后将流重置为其开始位置,以便可以重用。

使用mark()和reset()并不适用于所有类型的输入流,所以我想知道是否有一个“通用”开源Java类(即流包装器)可以对任何类型的输入流执行此操作。

另外,制作副本以避免转换错误的最安全方法是什么?

I want to copy the "start" (i.e., first N characters) of an InputStream and then reset the stream to its start, so that it can be reused.

Using mark() and reset() does not work for all types of input streams, so I was wondering if there is a "generic" open source Java class (i.e., a stream wrapper) that can do this for any type of input stream.

Also, what would be the safest way of making the copy to avoid conversion errors?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

枫以 2024-12-07 21:22:48

也许您可以将 InputStream 包装在 PushbackInputStream 这样你就可以读取前 N 个字节,然后 unread() 它们用于重用流。

Maybe you could wrap your InputStream in a PushbackInputStream so you could read the first N bytes then unread() them for reuse of the stream.

凹づ凸ル 2024-12-07 21:22:48

看看 apache commons IOUtils 如何复制流 IOUtils#copyLarge()

您可以使用 populate ab ByteArrayInputStream 这样的方式。

  • 大小,
  • byte[] buffer = new byte[n]; // n 是使用 IOUtils#copyLarge() 中的技术开始填充缓冲区的
  • 使用 创建 ByteArrayInputStream您之前创建的 code>buffer

以下是 IOUtils#copyLarge() 的代码片段

public static long copyLarge(InputStream input, OutputStream output)
        throws IOException {
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    long count = 0;
    int n = 0;
    while (-1 != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
        count += n;
    }
    return count;
}

Take a look at how apache commons IOUtils copies stream IOUtils#copyLarge().

You can use populate ab ByteArrayInputStream such a way.

  • byte[] buffer = new byte[n]; // n is the size from start
  • pupulate the buffer using technique from IOUtils#copyLarge()
  • create your ByteArrayInputStream using the buffer you created earlier

Here is the code snippet to IOUtils#copyLarge()

public static long copyLarge(InputStream input, OutputStream output)
        throws IOException {
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    long count = 0;
    int n = 0;
    while (-1 != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
        count += n;
    }
    return count;
}
装迷糊 2024-12-07 21:22:48

当涉及到重用流并且大小并不重要(例如几兆字节)时,获取流的 byte[] 一次,然后重新创建 ByteArrayInputStream 对象必要时使用存储的 byte[] 一直对我有用。 mark()reset() 不再有麻烦。

When it comes to reusing a stream and size doesn't matter (e.g. a few mega bytes), getting the byte[] of the stream once, and then recreating ByteArrayInputStream objects with the stored byte[] when necessary has always worked for me. No more trouble with mark() and reset().

妄断弥空 2024-12-07 21:22:48

经过相当多的实验后,似乎最好的(尽管不完美)方法是使用 InputStream 的 ma​​rk()reset() 方法。

如果原始流不支持标记/重置,一个简单的解决方法是将其包装在 BufferedInputStream 中。*

After quite a bit of experimentation, it seems that the best (although imperfect) approach is to use the mark() and reset() methods of the InputStream.

If the original stream does not support marking/resetting, an easy workaround is to wrap it inside a BufferedInputStream.*

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文