有没有一种简洁的方式来创建在谷歌番石榴的InputStream的InputSupplier?
题
有几个工厂方法在谷歌番石榴创建InputSuppliers,例如从byte[]
:
ByteStreams.newInputStreamSupplier(bytes);
或从File
:
Files.newInputStreamSupplier(file);
有没有类似的方法来创建一个给定的InputSupplier
的InputStream
?
也就是说,一种方式,比一个匿名类更简洁:
new InputSupplier<InputStream>() {
public InputStream getInput() throws IOException {
return inputStream;
}
};
背景:我想使用与例如InputStreams Files.copy(...)
或ByteStreams.equal(...)
。
解决方案
没有,我还没有看到任何东西。结果我想你已经找到了最好的方式。结果,唯一的选择在哪里存储在一个字节数组的输入流或文件,并创建一个供应商与ByteStreams.newInputStreamSupplier ()或Files.newInputStreamSupplier(),但我不鼓励做这样的。结果 你也可以使用
public static long copy(InputStream from, OutputStream to)
从ByteStreams
请参阅: SRC
其他提示
有没有办法任意InputStream
转换成InputSupplier<InputStream>
,因为InputSupplier<InputStream>
应该是一个对象,它可以创建一个新的,每次它InputStream
方法被调用时,新getInput()
。这是唯一可能当字节的潜在源是可用于重新使用;因此工厂方法采取byte[]
或File
并返回一个InputSupplier<InputStream>
。
作为迪米瑞斯表明,InputSupplier
涉及InputStream
在于Iterable
涉及Iterator
相同的方式。您所描述的匿名类不正确,因为它返回的相同的流每getInput()
被调用时,因此后续的调用会返回一个已经耗尽,封闭的InputStream
。
下面是你的匿名类另一个问题:动机InputSupplier
的部分是限制实际InputStream
,以便它可以自动关闭的知名度。如果换在InputStream
外部可见InputSupplier
,然后传递到一个实用的方法,该实用程序方法可以关闭InputStream
。你可能会与OK但是这并不是说番石榴希望促进清洁的使用模式。
当我发现自己想要做同样的事情,我意识到我是倒着做。代替这样做的:
Files.copy(InputSupplier.of(inputStream), destinationFile);
(不存在),我应该替代地这样做:
ByteStreams.copy(inputStream, Files.newOutputStreamSupplier(destinationFile));
这是错了,因为包装的Iterator的可迭代的,我觉得有一个像这样的事情进入图书馆零概率。由于恶露说,你可以使用ByteStreams.copy()方法,但似乎没有成为一个明显的原因就两个流做equals()方法。
我明白番石榴作者犹豫添加这样的(简单)方法 - 它是如何共同可以完全(或部分,但不知道在流离开的地方,所以它的一样好为不可用之后)读取两个数据流只是为了看看他们是相同的,没有任何其他数据处理?难道这些字节来自不可重复读的来源,如网络套接字?否则,如果它只是一个文件某处,或者在内存中的字节数组,还有其他方法使它们本身被做等同测试