有没有一种简洁的方式来创建在谷歌番石榴的InputStream的InputSupplier?

StackOverflow https://stackoverflow.com/questions/2363408

  •  23-09-2019
  •  | 
  •  

有几个工厂方法在谷歌番石榴创建InputSuppliers,例如从byte[]

ByteStreams.newInputStreamSupplier(bytes);

或从File

Files.newInputStreamSupplier(file);

有没有类似的方法来创建一个给定的InputSupplierInputStream

也就是说,一种方式,比一个匿名类更简洁:

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()方法。

我明白番石榴作者犹豫添加这样的(简单)方法 - 它是如何共同可以完全(或部分,但不知道在流离开的地方,所以它的一样好为不可用之后)读取两个数据流只是为了看看他们是相同的,没有任何其他数据处理?难道这些字节来自不可重复读的来源,如网络套接字?否则,如果它只是一个文件某处,或者在内存中的字节数组,还有其他方法使它们本身被做等同测试

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top