2011-11-22 82 views
5

經過在使用原始字節流的會議聊天應用程序中苦苦試圖實現TCP文件傳輸後,我決定發送我想通過對象流傳輸的文件要容易得多。這些文件作爲內存中的File對象發送並存儲在其目的地(無論是中央服務器還是下載客戶端)。但是,這些文件只是File對象 - 客戶端應該能夠打開它們。有沒有辦法在Java中保存File對象作爲硬盤文件,甚至通過Java打開它們?Java保存/打開文件對象

回答

8

你是什麼意思與「文件對象」;你的意思是java.io.File

java.io.File類只是一個目錄名稱和文件名的表示形式。它不是可以容納文件內容的對象。

如果你有數據,例如在內存中的字節數組,然後是的,你可以在保存到一個文件:

byte[] data = ...; 

OutputStream out = new FileOutputStream(new File("C:\\someplace\\filename.dat")); 
out.write(data); 
out.close(); 

請參閱從Oracle的Java教程的Basic I/O Lesson學習如何讀寫文件與FileInputStreamFileOutputStream

+0

我不好意思,沒有意識到java.io.File無法保存文件內容。董事會如此:( –

1

你應該看看Data Handlers

您可以用它們來傳輸文件Data Sources但在一個「透明」的方式給你。

+0

謝謝,將來看看他們 –

0

我已經決定了它更容易發,我想通過對象流傳輸 文件「

這不是壞主意:。費用內存和延遲(即時間和空間) 。只需發送和接收字節,用前面的東西告訴你文件名和文件大小。

+0

我試着用PrintWriter發送文件名, d然後使用BufferedOutputStream處理原始字節。文件名和字節將從發送方發送沒有問題。接收端也可以接收文件名,但是它不能接收任何原始字節 - 它只是空文件。當我切換到使用對象流時,它似乎工作? –

+1

@RichardStokes這將永遠不會工作。在連接的整個生命週期中,在兩端使用相同的流。 PrintWriter有一個緩衝區,BufferedOutputStream有一個緩衝區,BufferedReader有一個緩衝區,BufferedInputStream有一個緩衝區。太多的緩衝區以保證整個電線的連貫性。我將使用DataOutputStream/DataInputStream來處理所有事情,使用writeUTF()/ readUTF()發送文件名,使用writeLong()/ readLong()發送文件名,並使用write()和read()函數發送數據。 – EJP

+0

謝謝,精彩的評論。 –