Google Guava 中有一些工厂方法来创建 InputSuppliers,例如从一个byte[]
:
ByteStreams.newInputStreamSupplier(bytes);
或者从一个File
:
Files.newInputStreamSupplier(file);
有没有类似的方法来创建InputSupplier
对于给定的InputStream
?
也就是说,一种比匿名类更简洁的方式:
new InputSupplier<InputStream>() {
public InputStream getInput() throws IOException {
return inputStream;
}
};
背景:我想使用InputStreams,例如Files.copy(...)
or ByteStreams.equal(...)
.
没有办法转换任意值InputStream
进入一个InputSupplier<InputStream>
,因为一个InputSupplier<InputStream>
应该是一个可以创造新鲜事物的对象InputStream
每次它getInput()
方法被调用。仅当底层字节源可供重用时,这才可能实现;因此工厂方法需要byte[]
or File
并返回一个InputSupplier<InputStream>
.
正如迪米特里斯建议的那样,InputSupplier
涉及到InputStream
以同样的方式Iterable
涉及到Iterator
。您描述的匿名类不正确,因为它返回same每次都流getInput()
被调用,因此后续调用将返回InputStream
那已经用尽并关闭了。
这是匿名类的另一个问题:部分动机InputSupplier
是为了限制实际的可见性InputStream
以便它可以自动关闭。如果你包装一个外部可见的InputStream
in an InputSupplier
然后将其传递给实用程序方法,该实用程序方法可能会关闭您的InputStream
。您可能对此表示同意,但这并不是 Guava 想要推广的干净的使用模式。
当我发现自己想做同样的事情时,我意识到我正在做相反的事情。而不是这样做:
Files.copy(InputSupplier.of(inputStream), destinationFile);
(不存在),我应该这样做:
ByteStreams.copy(inputStream, Files.newOutputStreamSupplier(destinationFile));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)