0

私のユースケースは、ファイルを作成せずに 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

さらに、FilesAPIがあります:

public static OutputSupplier<FileOutputStream> newOutputStreamSupplier(File file,
                                                       boolean append)

OutputSupplier を使用できる方法はありますか?現在のコードよりもエレガントになりますか?

OutputSupplier が Supplier を実装しない理由はありますか?

4

1 に答える 1