java - 为什么尝试在 FileInputStream 上使用 mark() 和 reset() 会生成 IOException?

标签 java

我试图了解 mark()reset() 的实现是如何完成的,以便能够在 ByteArrayInputStream 上覆盖它和其他类,但不在类 FileInputStream 上。我们知道这两个类都扩展了抽象类 InputStream,它是两个方法的父类。这不是 final方法,因为我们可以在类 ByteArrayInputStream 上使用它们。使用什么技术来防止 FileInputStream 覆盖其他方法而不是这两个方法,即。 mark()reset()?

最佳答案

可以覆盖任何父类中的任何 protected 或公共(public)的非 final方法:

class A extends FileInputStream {
    public A(File file) throws FileNotFoundException {
        super(file);
    }

    @Override
    public synchronized void mark(int readlimit) {
        super.mark(readlimit);
    }

    @Override
    public long skip(long n) throws IOException {
        return super.skip(n);
    }
}

但我想我没答对您的问题?

FileInputStream.reset() 抛出 IOException,因为此类不支持标记和重置:

public synchronized void reset() throws IOException {
    throw new IOException("mark/reset not supported");
}

但是 mark() 不会抛出 IOException:

public synchronized void mark(int readlimit) {}

此行为也记录在 Javadoc 中.

关于java - 为什么尝试在 FileInputStream 上使用 mark() 和 reset() 会生成 IOException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30783549/

相关文章:

java - 谷歌距离 API

java - 如何从 Class<T> 推断 T 的方法

java - 如何在 linux 环境和 tomcat 中调试 jmv 堆栈与 java 应用程序崩溃 ramdonly?

java - 实现快速排序时出错

Java:我不明白这个 Sprite 表读取代码的部分意义是什么?

java - 使用 PrimeFaces 文件上传将值传递给支持 bean

java - 有哪些不同的 Eclipse 快捷方式可用?

java - 应用地球纹理贴图球体

java - 我在尝试检查互联网连接时收到 java.lang.NullPointerException?

java - Major Garbage Collection 是否收集两代人的对象?