我的用例是能够在不创建文件的情况下创建FileOutputStream。 所以我创建了这个基于Guava的OutputStream:
public class LazyInitOutputStream extends OutputStream {
private final Supplier<OutputStream> lazyInitOutputStreamSupplier;
public LazyInitOutputStream(Supplier<OutputStream> outputStreamSupplier) {
this.lazyInitOutputStreamSupplier = Suppliers.memoize(outputStreamSupplier);
}
@Override
public void write(int b) throws IOException {
lazyInitOutputStreamSupplier.get().write(b);
}
@Override
public void write(byte b[]) throws IOException {
lazyInitOutputStreamSupplier.get().write(b);
}
@Override
public void write(byte b[], int off, int len) throws IOException {
lazyInitOutputStreamSupplier.get().write(b,off,len);
}
public static LazyInitOutputStream lazyFileOutputStream(final File file) {
return lazyFileOutputStream(file,false);
}
public static LazyInitOutputStream lazyFileOutputStream(final File file,final boolean append) {
return new LazyInitOutputStream(new Supplier<OutputStream>() {
@Override
public OutputStream get() {
try {
return new FileOutputStream(file,append);
} catch (FileNotFoundException e) {
throw Throwables.propagate(e);
}
}
});
}
}
这样工作正常,但我看到有InputSupplier/OutputSupplier
个接口我可以使用...除了他们不扩展供应商所以我不能使用这里需要的记忆功能因为我不想要OutputSupplier
表现得像工厂一样。
此外还有Files
api:
public static OutputSupplier<FileOutputStream> newOutputStreamSupplier(File file,
boolean append)
有没有办法可以使用OutputSupplier,它会比我当前的代码更优雅?
OutputSupplier没有实现供应商的原因吗?
答案 0 :(得分:8)
InputSupplier
可以抛出IOException
,而Supplier
却无法抛出。{/ p>