【发布时间】:2021-10-15 13:56:06
【问题描述】:
是否可以将 ByteArrayOutputStream 转换为 InputStream? URLConnection.guessContentTypeFromStream() 我需要它。
我需要这个,因为我确实想避免 new ByteArrayInputStream(baos.toByteArray()),它会生成 两个 数据的新副本。
我检查了PipedInputStream 的javadoc,它似乎只能从PipedOutputStream 创建。
我试过了
try (PipedOutputStream pos = new PipedOutputStream()) {
pos.write(bytes);
try (InputStream is = new PipedInputStream(pos)) {
contentType = URLConnection.guessContentTypeFromStream(is);
}
}
catch (IOException e) {
throw new IOUncheckedException(e);
}
但它给了我
java.io.IOException: 管道未连接
是否有可能,也许将其转换为中间 PipedOutputStream,而不创建数据副本?
【问题讨论】:
-
管道 I/O(额外线程!)应该为您提供一个位于 ByteArrayOutputStream 上的 InputStream。只是改编一个例子。否则,由于您只需要数据开头的字节,只需复制这些字节即可。
-
@JoopEggen
Piped I/O (extra thread!) should give you an InputStream sitting on the ByteArrayOutputStream. Just adapt an example如果我有一个例子,我没有问:D -
这与管道流无关。你的大线索是here:参数:是-支持标记的输入流。如果您要覆盖该方法,则可以使用 BufferedInputStream,标记它并在完成启发式方法后将其重置。
-
ByteArrayOutputStream来自哪里?是否不可能用不同的OutputStream(例如管道末端)替换它在数据写入它之前存在?为什么? -
那么,是否可以将
OutputStream的创建与写入它的代码分开?所以一个调用者仍然可以创建一个ByteArrayOutputStream并将其传递给编写代码,而其他代码可以传递一个不同的OutputStream,例如PipedOutputStream。我看到删除的答案建议ByteArrayOutputStream的子类,这确实暗示了更改创建站点的可能性。
标签: java type-conversion pipe java-7 bytearrayoutputstream