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