根据此文档,它说:
void reset()
将此流重新定位到
mark
上次在此输入流上调用方法时的位置。
但是如果mark()
从未被调用会发生什么?它会重置到流的开头(这是我想要的)还是未定义?另外,当我查看它的文档时,markSupported()
它说:
测试此输入流是否支持
mark
和resetmethods
。
所以这也测试了reset,这表明reset也可能不被支持。如果我只是在自己的重置代码中关闭并重新打开流,在这种情况下会更安全吗?
根据此文档,它说:
void reset()
将此流重新定位到
mark
上次在此输入流上调用方法时的位置。
但是如果mark()
从未被调用会发生什么?它会重置到流的开头(这是我想要的)还是未定义?另外,当我查看它的文档时,markSupported()
它说:
测试此输入流是否支持
mark
和resetmethods
。
所以这也测试了reset,这表明reset也可能不被支持。如果我只是在自己的重置代码中关闭并重新打开流,在这种情况下会更安全吗?
文档提供了答案;不幸的是,这不是一个明确的答案:
的总合同
reset
是:如果方法 markSupported 返回
true
,则:
如果自创建流以来尚未调用方法标记,或者自上次调用标记以来从流中读取的字节数大于上次调用时标记的参数,则
IOException
可能会抛出 an。如果
IOException
没有抛出这样的an,则流被重置为这样的状态,即自最近一次调用mark(或自文件开始以来,如果尚未调用mark)读取的所有字节都将重新提供给后续调用者read 方法的后跟任何字节,否则这些字节将在调用重置时成为下一个输入数据。如果方法 markSupported 返回
false
,则:
对 reset 的调用可能会抛出
IOException
.如果
IOException
未抛出 an,则流将重置为固定状态,该状态取决于输入流的特定类型及其创建方式。将提供给 read 方法的后续调用者的字节取决于输入流的特定类型。
换句话说,如果markSupported()
返回,true
则流可以抛出一个IOException
或按照您的意愿行事。如果markSupported()
返回false
,那么它将抛出异常或以特定于实现的方式运行。
简而言之,接口契约不能保证实现会按照您的意愿行事。如果支持的话,最安全的似乎是markSupported()
在输入流的开头检查并设置一个标记。如果不支持,您需要进行试验以确保操作按预期运行,或者设计一种重新创建流的方法。
reset()
没有调用的行为mark()
不是很严格地指定,而是来自JavaDoc:
重置的一般合约是:
如果方法 markSupported 返回 true,则:
如果自创建流以来尚未调用方法标记,或者自上次调用标记以来从流中读取的字节数大于上次调用时标记的参数,则可能会引发 IOException。
如果没有抛出这样的 IOException,则流被重置为这样的状态,即自最近一次调用 mark (或从文件开始,如果未调用 mark )读取的所有字节将重新提供给后续read 方法的调用者,后跟任何字节,否则在调用重置时将成为下一个输入数据。