当文件大小发生变化时,Struts DiskFile.getInputStream()返回ByteArrayInputS



我试图分析我的应用程序中最近发现的一个问题,并意识到我的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();

最新更新