最近在作畢設。今天涉及到一個關於文件的拆分後發送給不一樣的服務器存儲,而後後續合併的問題。這裏我發現了一個有趣的問題。java
首先是文件大小:如下是源文件的大小服務器
這是一個視頻文件,視頻長度爲socket
在程序中我將該文件分割爲10份,若是按照當前計算spa
//path 文件路徑
File file = new File(path);
long size = file.length() / 10;
//size 61094683
複製代碼
若是按照這個大小進行分割文件的話設計
//file 源文件File對象
//socket 目標服務器的socket對象
for (int i = 0; i < 10; i++) {
try (FileInputStream in = new FileInputStream(file)) {
try (DataOutputStream out = new DataOutputStream(socket.getOutputStream())) {
in.skip(i * size);
byte[] bytes = new byte[1024];
int len = -1;
long sended = 0;
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
out.flush();
sended += len;
if (sended > size) break;
}
}
}
}
複製代碼
這裏我把緩衝區設置爲1K,實際上設計多少都沒問題,只要緩衝區不是根據文件傳輸的流進行實時計算且整除文件須要傳輸的流的話。code
緩衝區會將文件流分紅一塊一塊發送給對應服務器,所以雖然我開始將文件分爲十分且開始位置按照分紅的文件塊數進行傳輸。可是最終傳輸過去的文件並非嚴格按照對應大小。 例:cdn
第一塊文件我從輸入流的0下標開始,目標傳遞大小爲61094683B,可是實際文件傳輸的大小必定是緩衝區大小的倍數,即最終第一塊文件傳輸了61094912B大小的文件。可是第二塊文件傳輸的開始下標又是從61094683開始所以會有一部分產生重疊,詳情如圖:視頻
而用這種方法分割而且合併後的文件大小以下:對象
明顯多了許多字節,而視頻的長度爲:blog
對比先後並無發生變化。即我在視頻文件中插入了許多沒用的字節。那麼這些字節可否用來存儲其餘信息呢?有點諜戰片的味道了。因爲當先畢設時間緊迫,我在這裏先記下這個問題,等有空了再實施看看。
本人對音頻文件沒有過深的理解,不知道多餘出來的字節在理論上是否可行,要麼等接下來的實踐要麼在座各位若是有相關知識歡迎捉蟲