我试图分析我的应用程序中最近发现的一个问题,并意识到我的inputStream.reset()
方法失败是因为我试图在FileInputStream
上操作。
似乎我的方法调用For apache的DiskFile.getInputStram()
根据特定的文件大小阈值返回ByteArrayInputStream
实例(标记支持)或FileInputStream
实例(标记不支持)。
我必须得到这个输入流的代码是:
FormFile file = multipartForm.getFiles().get(0); // It's always one file
InputStream is = file.getInputStream();
// Read the stream and did job
// Now I want to reset it.
// bad coding from my side because I didn't check markSupported
is.reset();
// Got IO error immediately after this. But anything below 256KB is ok
我确信这在OracleJDK文档或apache的站点中有提到/解释。但似乎记不起任何参考文献。有人知道这种行为是否合理吗?
我不熟悉Struts API,但对我来说,当返回类型是InputStream
而不是特定的子类时,您无法保证返回流的实际类型。
由于调用reset()
只有在具有前一个mark(readlimit)
调用时才有效,因此一般处理未指定的InputStream
类型是直接的:
InputStream inputStream = …
int readlimit = …
if(!inputStream.markSupported()) {
inputStream = new BufferedInputStream(inputStream, readlimit);
}
inputStream.mark(readlimit);
// read some date, not more than readlimit
inputStream.reset();