Struts2 fileInputStream / read文件并将其放入内存

时间:2013-09-24 04:51:33

标签: java struts2

我正在使用struts2框架进行开发。用户可以从我们的网页下载图像。以下代码已经完成,但我对以下代码有一些疑问。

<result name="success" type="stream">
<param name="contentType">image/tiff</param>
<param name="inputName">fileInputStream</param>
<param name="contentDisposition">filename="test.tif"</param>
<param name="bufferSize">20480</param>
</result>

当用户请求图像时,系统会读取物理文件并将其传递给fileinputstream。

File f = new File("C:/test.tif");
fileInputStream = new FileInputStream(f);

但是,如果一个或多个用户同时请求相同的图像,那么上述代码是否会出现问题?如果是,我如何编辑代码以避免并发问题?

  1. 如何读取物理文件然后将其放入内存文件然后将内存文件传递到客户端站点?
  2. 由于

1 个答案:

答案 0 :(得分:0)

Struts2操作是ThreadSafe

它们是ThreadLocal,每个Action都有自己的变量实例。

如果三个用户调用该代码,则将创建三个FileInputStream。

要将文件加载到内存中,您可以从fileInputStream读取并写入ByteArrayOutputStreamread more),但为什么您要阅读内存中的所有文件然后将其传递给客户端?使用inputStream将 stream 传递给客户端是无用且昂贵的。如果设置了content-length,浏览器也会绘制进度条:|

假设您有private InputStream fileInputStream;和相关的Getter,您的代码只缺少返回值:

File f = new File("C:/test.tif");
fileInputStream = new FileInputStream(f);
return SUCCESS;

由于java.io.File表示文件系统中的文件而不是打开文件,因此您是安全的(下载完成后输入流将自动关闭)