Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用番石榴的InputSupplier或OutputSupplier api?_Java_Io_Guava - Fatal编程技术网

Java 如何使用番石榴的InputSupplier或OutputSupplier api?

Java 如何使用番石榴的InputSupplier或OutputSupplier api?,java,io,guava,Java,Io,Guava,我是guava图书馆的新手,我对输入供应商和输出供应商很困惑。根据javadoc,它们分别只是InputStream和OutputStream的工厂。然而,我看不出这两个接口有什么用处,有人能给我举个例子说明为什么除了更高的抽象性之外,我还应该使用这两个API吗?对于Guava的InputSupplier/OutputSupplier,您不必自己处理实例化FileInputStreams/FileOutputStreams时抛出的各种IOException。Guava将在调用InputSuppl

我是guava图书馆的新手,我对输入供应商和输出供应商很困惑。根据javadoc,它们分别只是InputStream和OutputStream的工厂。然而,我看不出这两个接口有什么用处,有人能给我举个例子说明为什么除了更高的抽象性之外,我还应该使用这两个API吗?

对于Guava的InputSupplier/OutputSupplier,您不必自己处理实例化FileInputStreams/FileOutputStreams时抛出的各种IOException。Guava将在调用InputSupplier.getInput()/OutputSupplier.getOutput()工厂方法时自动为您处理这些异常

通过将输入/输出构造封装在这些工厂接口中,可以推迟它们的实例化,从而推迟处理它们可能抛出的IOException/FileNotFoundException的时间。事实上,你拖延太久了,是番石榴帮你做的

然后,您可以替换

    FileInputStream inputStream = null;
    try {
        inputStream = new FileInputStream(file);
    } catch (FileNotFoundException ex) {
        throw new RuntimeException(ex);
    }

    doSomething(inputStream);

InputSupplier inputStreamSupplier=Files.newInputStreamSupplier(文件);
剂量测量(输入流供应商);

编辑:另请参见ColinD的回答,关于Guava在控制这些输入/输出的整个生命周期时(即使用输入/输出供应商获取它们时),如何为您关闭这些输入/输出.

这两种接口的主要优点是它们允许库代码控制实际输入/输出对象的整个生命周期。Guava的实用程序从不关闭直接传入的
InputStream
OutputStream
,因为这可能不是您想要的。即使他们这样做了,您仍然需要
尝试
/
最后
来处理创建对象的错误。供应商是一种懒惰的回调,它允许一次创建、使用和关闭实际对象,而无需您进行大量的尝试和错误处理

例如,只需查看将一个文件复制到另一个文件所需的代码(使用Guava实用程序将实际的复制和流关闭代码最小化):

如果使用供应商,请查看代码:

File in = ...
File out = ...
ByteStreams.copy(Files.newInputStreamSupplier(in), 
    Files.newOutputStreamSupplier(out));

+1 . 我喜欢你用“生命周期”的概念来解释它。我没有想到,番石榴只有在控制整个生命周期时才会关闭这些资源。这很有道理。谢谢。谢谢你的回复。我真的很喜欢你的回答。在Java 7中,使用try-with-resources语法可以缓解其中的一些优势,但是
c.g.c.io
无论如何都可能需要对Java 7进行彻底的重新设计。请接受。我们必须创建自己的实用程序方法,为API缺少的各种其他东西(如Path)创建InputSuppliers。在您的示例中使用泛型需要+1。我可以添加到示例代码中的唯一一件事是,当您在inputStreamSupplier上调用getInput方法时,您只需要捕获IOException。我还发现这本通用java烹饪书(可在()上找到)很有用。
File in = ...
File out = ...
FileInputStream inStream = new FileInputStream(in);
boolean threw = true;
try {
  /*
   * Note how two try/finally blocks are needed here, in case creating 
   * outStream fails.
   */
  FileOutputStream outStream = new FileOutputStream(out);
  try {
    ByteStreams.copy(inStream, outStream);
    threw = false;
  } finally {
    Closeables.close(outStream, threw);
  }
} finally {
  Closeables.close(inStream, threw);
}
File in = ...
File out = ...
ByteStreams.copy(Files.newInputStreamSupplier(in), 
    Files.newOutputStreamSupplier(out));