【问题标题】:reset() on Inputstream without mark()在没有标记()的输入流上重置()
【发布时间】:2013-06-11 07:39:06
【问题描述】:

根据this documentation 所说:

void reset()

将此流重新定位到上次对该输入流调用 mark 方法时的位置。

但是如果 mark() 从未被调用会怎样?它会重置到流的开头(这是我想要的)还是未定义?另外,当我查看markSupported() 的文档时,它说:

测试此输入流是否支持markreset methods

所以这也测试了重置,这表明重置也可能不被支持。如果我在自己的重置代码中关闭并重新打开流,在这种情况下是否更安全?

【问题讨论】:

  • 你试过了吗? (指的是“但是如果从未调用过 mark() 会发生什么?”)
  • 针对特定实现尝试一些示例与针对标准工作不同。是的,我知道它目前可以工作,但如果我用另一个实现扩展该类,它可能无法工作。
  • 我明白了,所以你想让代码独立于特定的流实现,对吧?如果我没记错的话,只有在支持标记时重置才有意义。而且我记得很清楚,如果它被支持并且标记没有被调用,那么 reset 将抛出一个 IOException 或倒回开始。
  • 谢谢。所以我想如果markSupported() 返回false,我应该重新打开。您应该将此作为答案发布。 :)
  • 您是否考虑阅读Javadoc? “如果自创建流以来尚未调用方法标记,或者自上次调用标记以来从流中读取的字节数大于上次调用时标记的参数,则可能会引发 IOException。”

标签: java inputstream


【解决方案1】:

documentation 提供了答案;不幸的是,这不是一个明确的答案:

reset的总合约是:

如果方法markSupported返回true,那么:

  • 如果自创建流以来尚未调用方法标记,或者自上次调用标记以来从流中读取的字节数 大于最后一次调用时要标记的参数,然后 IOException 可能会被抛出。

  • 如果没有抛出这样的IOException,则流将重置为一种状态,即自最近一次调用标记以来读取的所有字节 (或者从文件开始,如果没有调用标记)将是 重新提供给 read 方法的后续调用者,然后是任何 否则将成为下一个输入数据的字节 调用重置的时间。

如果方法markSupported返回false,那么:

  • reset 调用可能会抛出IOException

  • 如果未抛出 IOException,则流将重置为固定状态,具体取决于输入流的特定类型以及如何 它被创造了。将提供给后续调用者的字节 读取方法的多少取决于输入流的特定类型。

换句话说,如果markSupported() 返回true,则流可以抛出IOException 或按照您的意愿行事。如果markSupported() 返回false,那么它将抛出异常或以特定于实现的方式运行。

简而言之,接口契约不保证实现会按照您的意愿行事。最安全的方法似乎是检查markSupported() 并在输入流的开头设置一个标记(如果支持)。如果不支持,您需要进行试验以确保操作按预期运行,或者设计一种重新创建流的方法。

【讨论】:

  • 如果没有设置标记,至少 one 库实现会重置到开头。
  • @selig:实际上,无论对标记的任何调用如何,它都会重置到开头(对于该实现,markSupported() 返回false)。根据记录的合同,这是一种可能的行为,只是不能保证所有实现都可以。
【解决方案2】:

reset() 不调用mark() 的行为不是很严格,而是来自JavaDoc

reset的一般约定是:

  • 如果方法markSupported返回true,那么:

  • 如果自创建流以来尚未调用方法标记,或者自上次调用标记以来从流中读取的字节数大于上次调用时标记的参数,则可能会引发 IOException。

  • 如果没有抛出这样的 IOException,则流将被重置为这样的状态,即自最近一次调用 mark(或从文件开始,如果尚未调用 mark)读取的所有字节都将被重新提供给 read 方法的后续调用者,然后是任何字节,否则这些字节将在调用 reset 时成为下一个输入数据。

【讨论】:

  • 这个答案被否决了,因为..? :-( 我同意接受的答案更详细,但我在这里没有看到任何不准确或错误的内容......
猜你喜欢
  • 2023-04-09
  • 2014-01-02
  • 2013-07-25
  • 2013-09-18
  • 2011-04-22
  • 1970-01-01
  • 2011-08-04
  • 2011-07-17
  • 2015-08-12
相关资源
最近更新 更多