Google 番石榴:在弃用“InputSupplier”和“OutputSupplier”实用程序后使用“ByteSource”和“ByteSink”

Google guava: Using `ByteSource` and `ByteSink` after deprecation of `InputSupplier` and `OutputSupplier` utilities

我在我的项目中遇到了使用 Google Guava 的 InputSupplierOutputSupplier 实用程序的旧代码。由于这些 类 在最新版本中已弃用,因此我需要相应地重构我的代码。

通过在互联网上查看,我开始知道我可以使用 ByteSourceByteSink 来代替 InputSupplierOutputSupplier,只需做一些最小的更改。 下面的示例代表我使用 ByteSink 代替 OutputSupplier.

的情况
  public static OutputSupplier<? extends OutputStream> newOutputSupplier() {
    return new OutputSupplier<OutputStream>() {
      @Override
      public OutputStream getOutput() throws IOException {
        return new FileOutputStream(file);         // file defined earlier
      }

使用后ByteSink

public static ByteSink newOutputSupplier() {
    return new ByteSink() {
      @Override
      public OutputStream openStream() throws IOException {
        return new FileOutputStream(file); // file defined earlier
      }
    };
  }

InputSupplier 相关代码的类似重构。

问题一:以上重构是否正确?我的思考方向正确吗?

问题 2:我可以将 ZipOutputStream 包裹在 ByteSink 中吗?

问题 3:如果上一个问题是肯定的,我将如何从 ByteSink 中取回 ZipOutputStream returns OutputStream?在这种情况下,转换会像下面的代码片段那样工作吗?

ZipOutputStream zipOutputStream = (ZipOutputStream) newOutputSupplier().openStream(); // Casting

或者我需要从 OutputStream 创建新的 ZipOutputStream 吗?

ZipOutputStream zipOutputStream = new ZipOutputStream(newOutputSupplier().openStream());

问题 4:我可以包装任何类型的 InputStreamOutputStream 吗?

注意我主要给出了OutputStreamZipOutputStreamByteSink的例子,但我正在做InputStreamZipInputStreamByteSource.

的类似内容
  1. 您可能应该使用例如Files.asByteSink.
  2. 我不会。 ByteSink 适用于没有其他方法的通用 OutputStream
  3. 不适用。
  4. 是的,只要每次都能创建一个新的。