java - 当文件大小发生变化时,Struts DiskFile.getInputStream() 返回 ByteArrayInputStream 和 FileArrayInputStream

标签 java java-8 struts-1 fileinputstream bytearrayinputstream

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

我确信 Oracle JDK 文档或 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();

关于java - 当文件大小发生变化时,Struts DiskFile.getInputStream() 返回 ByteArrayInputStream 和 FileArrayInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47347194/

相关文章:

java - Java中如何检查类型是unsigned int还是signed int?

java - 在最大没有。 Activity 和 fragment

java - 为什么在 java 接口(interface)中使用 this 关键字,它指的是什么?

java - 如何从可选中提取字段参数,或者如果为空则抛出异常?

java - 有 getter 时没有 Getter Method Error

struts 1.2 - 将值从一个 Action 传递到另一个 Action

Java Magic Square - 求和列和求和行错误

java - 如何在纹理上绘制像素图?

java - java.lang.Thread 中新增的附加字段,是什么意思?

html - 如何使用 struts1.3 Action 生成动态组合框并在页面提交时也获取其值?