在创建 FileInputStream 对象时使用 InputStream 而不是 FileInputStream 有啥区别

Posted

技术标签:

【中文标题】在创建 FileInputStream 对象时使用 InputStream 而不是 FileInputStream 有啥区别【英文标题】:what is the difference in using InputStream instead of FileInputStream while creating the FileInputStream object在创建 FileInputStream 对象时使用 InputStream 而不是 FileInputStream 有什么区别 【发布时间】:2013-07-06 02:11:50 【问题描述】:

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

    InputStream is = new FileInputStream(filepath); FileInputStream is = new FileInputStream(filepath);

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

【问题讨论】:

FileInputStream 派生自 InputStream - 任何 FileInputStream 实例都必须是 InputStream。人们普遍倾向于使声明尽可能抽象。 这两种情况都没有区别。 Java - declaring from Interface type instead of Class的可能重复 这也是相关的:What does it mean to program to a interface? 【参考方案1】:

FileInputStream 扩展InputStream:它是专门为读取文件而设计的 InputStream 版本。

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

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

【讨论】:

【参考方案2】:

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

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

您的第一行代码可能比第二行更受欢迎,因为它不会将您锁定在 FileInputStream 中。

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

【讨论】:

【参考方案3】:

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

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

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

当然,这是一种普遍的良好做法,并且不仅仅适用于 InputStreams 等。

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于在创建 FileInputStream 对象时使用 InputStream 而不是 FileInputStream 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

使用FileReader进行文本文件操作时,read方法的返回值为啥时,表示读取到文件

FileInputStream和FileOutputStream文件复制

打开命名管道时,构造函数上的 FileInputStream 块

文件的输入流

IO——FileInputStream

Java Inventory - 如何使用 FileInputStream 读取文件?