2012-07-21 74 views
3

我有這個簡單的服務器/客戶端應用程序。我試圖讓服務器通過OutputStream(FileOutputStream,OutputStream,ObjectOutputStream等)發送文件,並在將其保存到實際文件之前在客戶端接收它。問題是,我試過這樣做,但它一直在失敗。每當我創建文件並將從服務器收到的對象寫入它時,我都會看到一張破損的圖像(我只是將它保存爲jpg,但這不重要)。下面是代碼的這是最有可能發生故障(所有你看到這裏已經事先聲明看似未聲明的對象)的部分:通過ObjectOutputStream發送文件,然後將其保存在Java中?

服務器:

   ObjectOutputStream outToClient = new ObjectOutputStream(
         connSocket.getOutputStream()); 
       File imgFile = new File(dir + children[0]); 
       outToClient.writeObject(imgFile); 
       outToClient.flush(); 

客戶:

ObjectInputStream inFromServer = new ObjectInputStream(
       clientSocket.getInputStream()); 
     ObjectOutputStream saveImage = new ObjectOutputStream(
       new FileOutputStream("D:/ServerMapCopy/gday.jpg")); 
     saveImage.writeObject(inFromServer.readObject()); 

所以,我的問題是我無法正確地通過流獲取對象,沒有得到一個破損的文件。

回答

11

A File object代表路徑而不是其實際內容。你應該做的是從該文件中讀取byte,然後通過你的ObjectOutputStream發送。

File f = ... 
ObjectOutputStream oos = ... 

byte[] content = Files.readAllBytes(f.toPath); 
oos.writeObject(content); 


File f=... 
ObjectInputStream ois = ... 

byte[] content = (byte[]) ois.readObject(); 
Files.write(f.toPath(), content); 
+0

我知道我錯過了一個步驟。我想我必須在發送文件之前做一些事情,因爲該文件對象不完整。 – ZimZim 2012-07-21 16:14:55

+2

雖然採用這種方法,但在將字節寫入套接字之前,您會將整個文件讀入內存。 – sarcan 2012-07-21 16:17:07

+0

@sarcan爲簡潔起見,我使用了'Files.read' /'Files.write'方法。 OP可以總是使用一個循環來遞增地寫字節 – Jeffrey 2012-07-21 16:25:36

1

你沒有實際傳輸的文件,但是從Java文件實例。把你的File對象看作是一個(服務器端)對該文件的本地句柄,而不是它的內容。要傳輸圖像,您實際上必須先在服務器上讀取它。

但是,如果您只是要保存客戶端上的字節,您可以忘記ObjectOutputStream開始。您只需傳輸存儲在文件中的字節。首先看一下FileChannel類及其transferTo和transferFrom方法。

+0

它甚至不是句柄,只是一個文件名,否則爲+1。 – EJP 2012-07-22 02:10:46

相關問題