20

这可能有点傻,但我想知道后台操作的区别。

  1. InputStream is = new FileInputStream(filepath);
  2. FileInputStream is = new FileInputStream(filepath);

以上两行代码有什么区别,分别在什么场景下使用。

4

5 回答 5

23

FileInputStreamextends InputStream:它是为读取文件而设计的 InputStream 的专用版本。

根据用途,InputStream 有几种实现。

使用代码中所需的最高类型通常是一种很好的做法。因此,如果您的代码需要从 a 读取数据,InputStream但不是专门从 a读取数据FileInputStream,您应该使用InputStream. 但是,如果您确实需要将对象的信息保留为 aFileInputStream而不仅仅是 a InputStream,那么您应该保留FileInputStream类型。

于 2013-07-08T16:47:50.757 回答
13

没有真正的区别。 FileInputStreamextends InputStream,因此您可以将InputStream对象分配为FileInputStream对象。最后,它是同一个对象,所以会发生同样的操作。

这种行为称为多态性,在面向对象编程中非常重要。

您的第一行代码可能比第二行更可取,因为它不会将您锁定在FileInputStream.

这是面向对象编程的优势之一。不指定类型允许您更改稍后使用的流类型。如果您确定只需要FileInputStream此处,请使用第二行代码。

于 2013-07-08T16:44:21.257 回答
4

其他答案几乎已经确定了,但我想添加以下内容。

如果引用变量的类型is严格来说是您的类的内部实现细节,即没有其他类会直接或间接地发现它,那么这两个语句之间实际上没有区别,即使我会针对更基本的类型(InputStream)只是因为。

但是,如果通过您的类的接口泄漏 FileInputStream 特定行为的最轻微暗示,而这对于您要解决的问题不是必不可少的,您应该始终针对更基本的类型进行编程。

当然,这是一种普遍的良好做法,适用于更多的 InputStreams 等。

于 2013-07-08T17:18:44.563 回答
3

与其他答案状态一样,行为没有区别。它仍然是同一个对象,并且将执行相同的方法。InputStream您可以分配继承给该变量的任何类型的对象。

但是,到目前为止没有人提到的是:您只能调用InputStream在该变量上声明的操作。如果FileInputStream会提供一些额外的操作,如果你试图调用它,编译器会抛出一个错误。在这种情况下,您需要FileInputStream用作变量的类型。

于 2013-07-08T16:54:16.280 回答
2

没有区别。在每种情况下,您都在创建一个FileInputStream. 第一个可能是更好的编程风格,因为您通常应该使用类interface而不是具体类以允许灵活性(即您决定使用 a BufferedInputStream)。

于 2013-07-08T16:44:33.180 回答