为什么Guava InputSupplier / OutputSupplier不扩展供应商界面?

时间:2013-09-18 09:45:20

标签: java guava

我的用例是能够在不创建文件的情况下创建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没有实现供应商的原因吗?

1 个答案:

答案 0 :(得分:8)

InputSupplier可以抛出IOException,而Supplier却无法抛出。{/ p>