java.io困境

时间:2012-05-14 10:02:05

标签: java filereader inputstreamreader

类java.io.Reader和java.io.InputStreamReader都具有完全相同签名的读取方法

public int read(char[] charbuf, int offset, int length) throws IOException

现在根据java文档,类java.io.FileReader继承这两个这些read()方法来自两者上述类。

现在FileReader扩展了InputStreamReader,进一步扩展了Reader

(Reader <-- Inputstreamreader <-- FileReader)

和read()在两个类中都有相同的签名,不应该是因为InputStreamReader从Reader读取了read()而且FileReader继承了那个over-ridden方法??或者我错过了什么?

FileReader继承的两个read()s的功能略有不同(在等待输入时大约有一个块,而另一个没有)。

2 个答案:

答案 0 :(得分:4)

InputStreamReader中的方法为Reader中的 abstract 方法提供了实现。 FileReader不会进一步覆盖该方法;它只是从InputStreamReader继承了实现。

请注意,有四个签名可供阅读:

public int read()
public int read(char[] cbuf, int offset, int length)
public int read(char[] cbuf)
public int read(CharBuffer target)

InputStreamReader仅覆盖前两个。也许那令你困惑的是什么?

答案 1 :(得分:1)

好吧,我们来看看源代码吗?

班级Reader

abstract public int read(char[] cbuf,
    int off,
    int len) throws IOException

所以,abstract,这里没什么可看的。

班级InputStreamReader

public int read(char[] cbuf,
    int offset,
    int length) throws IOException 

{
        return sd.read(cbuf, offset, length);
}

所以这里我们从Reader覆盖了方法。

最后,FileReader没有定义此类方法,因此它只是从InputStreamReader继承它。