关于File和InputStream参数的API设计问题

时间:2011-04-06 05:42:27

标签: java api

我可以将File视为InputStream的一个特例,并提供1个API,如

 test(InputStream stream)

或两个重载API更好

test(File f)
test(InputStream stream)

3 个答案:

答案 0 :(得分:3)

文件肯定不是输入流。它可用于创建输入流,但它本身不是一个。

请注意,您提供的重载具有根本不同的特征 - 接受File的方法不需要更改任何状态,但接受InputStream的方法几乎肯定会。此外,假设他们将在内部执行类似操作,File方法将要关闭方法中打开的流; InputStream方法不会想要关闭流,因为它不“拥有”它。

没关系 - 无论如何都可以使用这两种方法 - 但是你需要注意区别。

另一种选择是使用Guava库并使用InputSupplier<InputStream> - 然后调用者可以使用Files.newInputStreamSupplier(file)来指定流,但也可以使用与网络相关的输入流的供应商等等。

答案 1 :(得分:1)

提供接受InputStream的API可能是该领域最常用的方法。

如果经常/有时会调用API,目的是从文件加载,那么提供接受File的额外重载可能是有利的。

最后,它归结为使用某些内容的频率:添加额外的重载方法不会花费太多,但如果您的API充斥着未使用的方法,那么它可能会变得不那么优雅。

答案 2 :(得分:0)

这是唯一的方法:

test(URL url)

?现在,您的API能够处理文件系统上的文件,HTTP / FTP资源,CLASSPATH资源(请参阅ClassLoader.getResource()),以及更多开箱即用(支持的协议实际上是可插入的)。

只需致电URL.openConnection() .getInputStream();