我怎么知道哪个文件流支持Java搜索

时间:2014-01-15 11:38:07

标签: java inputstream fileinputstream seek

java.io.InputStream.skip()说:“扔: IOException - 如果流不支持seek,或者发生其他I / O错误。“

我如何知道哪个文件流支持搜索?

当google我找到Seekable时,我可以看到简单的FileInputStream,ByteArrayInputStream ...也支持skip(),我的意思是不给IOException;他们没有扩展Seekable。

4 个答案:

答案 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的实例”);