2013-09-24 55 views
0

我正在使用struts2框架進行開發。用戶可以從我們的網頁下載圖像。下面的代碼工作,但我對下面的代碼有一些問題。Struts2 fileInputStream /讀取文件並將其放入內存

<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> 

當用戶請求圖像時,系統讀取物理文件並將其傳遞到文件輸入流。然而,如果一個或多個用戶在同一時間請求相同的圖像,那麼對於上述代碼是否會出現任何問題?如果是,我如何編輯代碼以避免併發問題?

  1. 如何讀取物理文件,然後將其放入內存文件,然後將內存文件傳遞到客戶端網站?

感謝

+0

由於您正在創建一個新的FileInputStream,它應該是安全的。只要確保你沒有在飛行中修改它。如果你不想爲每個請求讀取文件,我會在Singleton類中有文件。或者你可以參加一個會議。 – batbaatar

回答

0

Struts2的操作是線程安全的

他們是ThreadLocal,每個Action都有自己的變量實例。

如果有三個用戶調用該代碼,則會創建三個FileInputStream。

加載文件到內存中,你可以從fileInputStream讀取和寫入ByteArrayOutputStreamread more),但爲什麼你想讀內存中的所有文件,然後將它傳遞給客戶端?它是無用的和昂貴的,只是它與您的inputStream的客戶端。如果您設置內容長度,瀏覽器也會繪製進度條:|

假設你有private InputStream fileInputStream;和相關Getter,你的代碼是唯一缺少的返回值:

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

由於java.io.File代表在文件系統中的文件,而不是一個打開的文件,你是安全的(輸入一旦下載完成,流將自動關閉)

相關問題