java.io.InputStream.skip()说:“扔: IOException - 如果流不支持seek,或者发生其他I / O错误。“
我如何知道哪个文件流支持搜索?
当google我找到Seekable时,我可以看到简单的FileInputStream,ByteArrayInputStream ...也支持skip(),我的意思是不给IOException;他们没有扩展Seekable。答案 0 :(得分:6)
唯一可以确定的方法是读取您感兴趣的任何特定流的javadoc。继承层次结构非常糟糕,但它是一个旧类。
编辑: 我只是读了javadoc,虽然看起来InputStream本身 实现它(带有简单的读/放弃实现),但它说
“鼓励子类提供更有效的实现 这种方法。例如,实现可能取决于 寻求能力。“
现在,如果不支持搜索,而不是抛出IOException
,子类总是可以使用默认实现。但是,很可能是由于向后兼容性,这种神奇设计的神器已被遗忘。
答案 1 :(得分:2)
InputStream根据定义不可搜索。您只能在流中跳过前进而不是后退(唯一的例外是使用reset()重绕流,仅适用于支持mark的流)。
对于skip()方法,跳过总是可行的,实际上InputStream类已经通过简单地读取和丢弃字节来实现它。特定的InputStream子类可以以不同的方式实现它(对特定类型更有效)。
throws注释“IOException - 如果流不支持seek,或者是否发生其他I / O错误。”是误导性的,因为它意味着可能存在明确不允许跳过字节的流(这没有任何意义,因为跳过在语义上与读取和丢弃相同)。
答案 2 :(得分:1)
您可以使用FileInputStream
移动FileInputStream.getChannel.position(long)
位置。 Skip用于流,它与定位不同,你不能再用它,它是随机访问设备(HDD)
答案 3 :(得分:0)
您可以检查类型,否则可以决定是否出现异常...
如果!(在Seekable实例中){ 抛出新的IllegalArgumentException(“不是Seekable的实例”);