4

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 继承了该覆盖的方法吗?或者我在这里错过了什么?

此外,由 FileReader 继承的两个 read() 功能略有不同(大约一个在等待输入时阻塞,而另一个则不阻塞)。

4

2 回答 2

4

中的方法InputStreamReader提供了中抽象方法的实现ReaderFileReader不再覆盖该方法;它只是从InputStreamReader.

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

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

InputStreamReader仅覆盖其中的前两个。也许这就是让你困惑的地方?

于 2012-05-14T10:08:11.047 回答
1

好吧,让我们检查一下源代码好吗?

阅读器

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);
}

所以这里我们重写了 from 的方法Reader

最后,FileReader没有定义这样的方法,所以它只是从InputStreamReader.

于 2012-05-14T10:09:31.740 回答