最近在作毕设。今天涉及到一个关于文件的拆分后发送给不一样的服务器存储,而后后续合并的问题。这里我发现了一个有趣的问题。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
对比先后并无发生变化。即我在视频文件中插入了许多没用的字节。那么这些字节可否用来存储其余信息呢?有点谍战片的味道了。因为当先毕设时间紧迫,我在这里先记下这个问题,等有空了再实施看看。
本人对音频文件没有过深的理解,不知道多余出来的字节在理论上是否可行,要么等接下来的实践要么在座各位若是有相关知识欢迎捉虫