私のユースケースは、ファイルを作成せずに 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);
}
}
});
}
}
これは正常に動作しますが、使用できるインターフェイスがあることを確認しました... ただし、それらは Supplier を拡張しないため、工場InputSupplier/OutputSupplier
のように動作させたくないため、ここで必要なメモ化機能を使用できません。OutputSupplier
さらに、Files
APIがあります:
public static OutputSupplier<FileOutputStream> newOutputStreamSupplier(File file,
boolean append)
OutputSupplier を使用できる方法はありますか?現在のコードよりもエレガントになりますか?
OutputSupplier が Supplier を実装しない理由はありますか?