通过覆盖Java类来表现不佳?

时间:2009-07-09 15:33:06

标签: java file-io performance

我有以下类FilterInputStream的子类,只有一个方法被覆盖。然而,这门课的表现太差了。它的执行速度是其超类的1/10。我甚至从javasrc的InputStream中获取了相同的源代码,并在我的子类中使用它。性能相同。覆盖类有什么问题吗?

public class NewLineStream extends FilterInputStream    {


public NewLineStream(InputStream in) {
    super(in);
}



public int read(byte[] b, int off, int len) throws IOException  {       
    if (b == null) {
        throw new NullPointerException ();
    } else if ((off < 0) || (off > b.length) || (len < 0) ||
            ((off + len) > b.length) || ((off + len) < 0)) {
        throw new IndexOutOfBoundsException ();
    } else if (len == 0) {
        return 0;
    }

    int c = read();
    if (c == -1) {
        return -1;
    }
    b[off] = (byte)c;

    int i = 1;
    try {
        for (; i < len ; i++) {
            c = read();
            if (c == -1) {
                break;
            }
            if (b != null) {
                b[off + i] = (byte)c;
            }
        }
    } catch (IOException  ee) {
    }
    return i;
}

}

5 个答案:

答案 0 :(得分:2)

这个方法是逐字节读取的,我猜这就是为什么它表现得这么糟糕。 FilterInputStreams通常只是包装其他输入流,所以如果你不打算进行任何过滤,只需在包装流上调用read(byte [],int,int)。

答案 1 :(得分:0)

是的,你逐个阅读(),如果没有潜在的缓冲,它会非常慢。传入BufferedInputStream,它应该加速。

答案 2 :(得分:0)

对于几乎所有目的,覆盖类的性能命中应该可以忽略不计。

也许问题出在InputStream你正在装修。

答案 3 :(得分:0)

  

重写课程有什么问题吗?

不,它没有。

但是FilterInputStream只是使用构造函数传递的InputStream周围的装饰器。我会将输入流包装在缓冲的一个周围,如BufferedInputStream

NewLineStream nws = new NewLineStream(new BufferedInputStream(in));

答案 4 :(得分:0)

大多数时候,当开发人员认为他们发现了JDK中的错误或Java的工作方式时,通常只是开发人员的误解。 Java已经十多年了,最常见的bug已经解决了。

现在可能很难解决很多糟糕的设计决策,但我想不出任何影响性能的因素或者没有已知的工作。