2012-09-22 37 views
0

我用Java編寫的客戶端 - 服務器程序中,我派從服務器到client.As一個文件,文件大小可能是相當高的發送文件,因此我決定將文件分割的5份然後將其發送給5個不同線程中的同一個客戶端。通過參加JAVA

  • 我的算法是使用Java Zip API並創建要發送的文件的zip文件,然後我將Zip文件分成5個部分。 問題是[ZIP API] [2]中沒有可以分割文件的方法。 This is the tutorial我指的是通過主題發送文件。 任何能夠指導我的人都有我的算法有什麼問題或者我需要採用不同的策略嗎?
+3

爲什麼5個部分?這對我來說似乎很隨意。爲什麼不確定一個最大合理的塊大小,並將其分成無論哪個塊都需要? –

+0

@JonSkeet這是正確的,但讓我們假設爲5 ..明顯如果我們可以爲5做,我們可以做任何數字..主要問題是ZIP API Stuf .. – user1690523

+0

在我看來,你應該拆分文件上適當數量的塊,然後在單個線程中以串行順序分別壓縮併發送每個塊。 –

回答

2

您應該將拉鍊部分與分割部分分開。如果您必須將這些文件發送給客戶端,那麼您可能不希望在整個zip文件保存在內存中,同時等待客戶端請求下一個塊......所以最簡單的方法是先壓縮到磁盤,然後以大塊形式提供該文件。那時,它根本就不是一個zip文件 - 事實上,對於某些文件類型(例如圖像,聲音,視頻),你可能根本不想通過zip文件進行操作。

我建議你告訴客戶端的文件名稱和大小,然後讓客戶端請求它想要的文件的任何部分。然後,它可以決定要使用的塊大小:您只需要查找文件的右側位,並根據客戶端的要求提供儘可能多的數據。

+0

我可以將一個不是文本文件的普通文件分成幾塊嗎? – user1690523

+0

@ user1690523:當然。我的答案中沒有任何內容對文字提出任事實上,試圖將其當作文本並在*字符*邊界處分裂更加困難。只要將文件看作一個字節桶即可。 –

+0

但函數如length(),它們對文本文件進行操作並返回數字字符,它們將如何在非文本文件上操作,例如MP3文件。 – user1690523

0

分手的文件不是一個ZIP功能。您可以從生成的zip文件(通過分割數組)創建多個字節數組,並將每個分段發送到不同的線程中。這將與昔日的下載管理者所做的相似。

然後客戶端將有代碼以正確的順序重新組裝字節數組。您可能需要爲每個片段添加一些附加信息,例如正確的序列,要恢復的文件名以及期望的片段數。

+0

這裏有很多代碼示例(例如http://www.exampledepot.com/egs/java.io/file2bytearray.html)將文件讀入字節數組,但是你可以將你的'byte []'大小設置爲你想要的大小,並且只是將大量數據讀入它。我可能會用上面提到的信息創建一些標題添加到數組的前面。 – KappaMax