最近在做畢設。今天涉及到一個關於檔案的拆分後傳送給不同的伺服器儲存,然後後續合併的問題。這裡我發現了一個有趣的問題。
首先是檔案大小:以下是原始檔的大小
![在檔案中夾雜其他資訊](https://i.iter01.com/images/e5b82ecd69c3641e4ba6452fd294575ffed0ebb0c952a872da7bab7a80f4ec44.png)
這是一個視訊檔案,視訊長度為
![在檔案中夾雜其他資訊](https://i.iter01.com/images/1f37f7dd3efa83e38a030ac5a97d4fb8f4f142050a962dacdaf0ed3cacbf7f9a.png)
在程式中我將該檔案分割為10份,如果按照當前計算
//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,實際上設計多少都沒問題,只要緩衝區不是根據檔案傳輸的流進行實時計算且整除檔案需要傳輸的流的話。
緩衝區會將檔案流分成一塊一塊傳送給對應伺服器,因此雖然我開始將檔案分為十分且開始位置按照分成的檔案塊數進行傳輸。但是最終傳輸過去的檔案並不是嚴格按照對應大小。 例:
第一塊檔案我從輸入流的0下標開始,目標傳遞大小為61094683B,但是實際檔案傳輸的大小一定是緩衝區大小的倍數,即最終第一塊檔案傳輸了61094912B大小的檔案。但是第二塊檔案傳輸的開始下標又是從61094683開始因此會有一部分產生重疊,詳情如圖:
![在檔案中夾雜其他資訊](https://i.iter01.com/images/233253cf40d1c254668620a9c6984d786dd1a0f59f743addc8e5544b9821923d.png)
而用這種方法分割並且合併後的檔案大小如下:
![在檔案中夾雜其他資訊](https://i.iter01.com/images/02f93ba1bccc479c1fc0f434539542f04bfe1de34a7077f14fead5e02c5f1d09.png)
明顯多了許多位元組,而視訊的長度為:
![在檔案中夾雜其他資訊](https://i.iter01.com/images/0d54207b281fdce51320e943f0737442b2cc220a8ca9176dcc5c7c670a9ee2e2.png)
對比前後並沒有發生變化。即我在視訊檔案中插入了許多沒用的位元組。那麼這些位元組能否用來儲存其他資訊呢?有點諜戰片的味道了。由於當先畢設時間緊迫,我在這裡先記下這個問題,等有空了再實施看看。
本人對音訊檔案沒有過深的理解,不知道多餘出來的位元組在理論上是否可行,要麼等接下來的實踐要麼在座各位如果有相關知識歡迎捉蟲