【问题标题】:How FileReader constrcuts FileInputStream and Input Reader?FileReader 如何构造 FileInputStream 和 Input Reader?
【发布时间】:2018-05-13 11:50:52
【问题描述】:

我有点怀疑,这可能是个很蹩脚的问题,但请多多包涵。

我正在检查 FileReader 的源代码。因此,当 FilerReader 创建时,它会构造 FileInputStream。这是代码sn -p

public class FileReader extends InputStreamReader {


    public  FileReader(String fileName) throws FileNotFoundException {

        super(new FileInputStream(fileName));

    }

我的疑问是 FileReader 扩展了 InputStreamReader,这里 FileReader 是 InputStreamReader 的子级,但是当调用 FileReader 的构造函数时,这怎么可能"super(new FileInputStream(fileName));"

在 InputStreamReader 父类中没有接受 new FileInputStream(fileName) 作为参数的构造函数或方法。

文件输入流具有以下层次结构..

 java.lang.Object
    java.io.InputStream
        java.io.FileInputStream

FileInputStream 和 InputStreamReader 之间似乎没有任何关系..!

谁能帮助我理解这一点? super(new FileInputStream(fileName)); 是如何以及从哪里被调用的?

【问题讨论】:

    标签: java


    【解决方案1】:

    在父类InputStreamReader中没有接受new FileInputStream(fileName)作为参数的构造函数或方法。

    没错,但FileInputStreamInputStream 的子类,所以FileReader 构造函数正在调用InputStreamReader​(InputStream in)。请记住,您可以将子类实例(FileInputStream 对象)作为参数传递给接受超类实例(InputStream 对象)作为参数的方法或构造函数。

    【讨论】:

    • @Andrea - FileReaderFileInputStream 没有必要关联;构造函数可以做它想做的任何事情,包括创建完全不相关的类的实例。在这里,FileReader 正在创建一个FileInputStream(不在其层次结构中),因此它可以将其作为 argument 传递给super(InputStream)(即InputStreamReader(InputStream))。我建议通读 Java 站点上的 this tutorial 并阅读其他一些和/或一本好的初学者 Java 书籍。编码愉快!
    • @Andrea - 一点也不!我们都是新的一次! :-)
    • @Crowder,最后一个问题....当我像这样 FileReader(String fileName) 调用 FileReader 构造函数时,会创建不同的实例,1) FIleReader 本身 2) InputStreamReader 3) FileInputStream。所以我可以知道他们是如何排队从文件中读取内容的吗?我的意思是它首先连接到源文件等等......!
    • @Andrea - FileReader InputStreamReader,它们是同一个对象。该对象创建一个FileInputStream 来完成读取文件数据的实际工作;它做了一些额外的工作,因此它可以提供Reader(面向字符)API,而不是InputStream(面向字节)API。
    • @Crowder,所以我可以说...FileInputStream 由 FIleReader 包装。正确的..?如果没记错的话,抽象模型应该是这样的……Filereader----->FileInputStream---->SourceFile。但如果是这种情况,那么两者如何相互协调,因为一个读取字节和其他字符......?其次,我无法理解您的评论“它做了一些额外的工作,因此它可以提供 Reader(面向字符)API 而不是 InputStream(面向字节)API”......你能详细说明一下吗?跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多