2011-08-17 48 views
2

考慮這兩個函數:如何通過RMI傳遞InputStream

Function A以inputStream爲參數。

public void processStream(InputStream stream) 
{ 
    //Do process routine 
} 

Function B加載文件內容將它傳遞給Function AInputStream

pulic void loadFile() 
{ 
File file =new File("c:\\file.txt"); 
//Pass file as InputStream 
} 

如何我可以通過從Function B文件Function A爲InputStream的不讀它的第一手資料?

我做了這樣的事情:

File file = new File("c:\\file.txt"); 
DataInputStream stream= new DataInputStream(new FileInputStream(file)); 

這產生下面的異常:

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.DataInputStream 

編輯:

loadFile()被傳遞的InputStream爲RMI響應。

+1

你的問題真的是'如何通過RMI傳遞InputStream'?答案是你不能。 – EJP

回答

3

下應該只是罰款

processStream(new FileInputStream(file)); 

您應該只試圖序列一個InputStream實例由ObjectOutputStream like爲

objectOutputStream.writeObject(inputStream); 

你明顯在做processStream()方法。這就是特例正試圖告訴你的。如何正確解決問題取決於您在問題中省略的唯一功能要求。


更新按照註釋

我傳遞的InputStream作爲RMI響應。

存在問題。您不能以RMI響應傳遞不可序列化的對象,更不用說未讀取的流。您需要將InputStream讀爲ByteArrayOutputStream通常的IO方式,然後使用它的toByteArray()來獲得byte[],然後通過它。例如:

InputStream input = new FileInputStream(file); 
ByteArrayOutputStream output = new ByteArrayOutputStream(); 
byte[] buffer = new byte[8192]; 

for (int length = 0; (length = input.read(buffer)) > 0;) { 
    output.write(buffer, 0, length); 
} 

byte[] bytes = output.toByteArray(); // Pass that instead to RMI response. 

雖然對大文件要小心。一個byte[]的每個字節都會佔用JVM內存的一個字節。

+0

'@ BalusC'我將InputStream作爲RMI響應傳遞。 – Bitmap

+0

查看更新的答案。 – BalusC

+0

我做了一些研究,發現了這個庫:http://openhms.sourceforge.net/rmiio/,它可能允許您通過RMI流式傳輸數據(如果它太大而無法保存在內存中)。 – Spina

0

您可以通過FileInputStream

processStream(new FileInputStream(yourFile)); 

您得到異常的原因是因爲DataInputStream要讀取基本Java類型

0

該異常似乎表明您正在使用類似RMI的遠程對象調用processStream方法?如果是這樣的話,你需要重新訪問你正在做的事情。通過RMI發送數據流並不是一件容易的事情。如果你是保證要使用小文件,你可以將文件數據複製到byte[]並將其傳遞給遠程方法調用。但是,如果您需要處理較大的文件,這很可能會導致客戶端和/或服務器上的內存問題。在這種情況下,您應該使用rmiio之類的東西,它提供了通過RMI流式傳輸數據的實用程序。

+0

'@ jtahlborn' yes loadFile()傳遞InputStream作爲RMI響應。 – Bitmap