在文件中夹杂其他信息

344 阅读2分钟

最近在做毕设。今天涉及到一个关于文件的拆分后发送给不同的服务器存储,然后后续合并的问题。这里我发现了一个有趣的问题。

首先是文件大小:以下是源文件的大小

这是一个视频文件,视频长度为

在程序中我将该文件分割为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开始因此会有一部分产生重叠,详情如图:

而用这种方法分割并且合并后的文件大小如下:

明显多了许多字节,而视频的长度为:

对比前后并没有发生变化。即我在视频文件中插入了许多没用的字节。那么这些字节能否用来存储其他信息呢?有点谍战片的味道了。由于当先毕设时间紧迫,我在这里先记下这个问题,等有空了再实施看看。

本人对音频文件没有过深的理解,不知道多余出来的字节在理论上是否可行,要么等接下来的实践要么在座各位如果有相关知识欢迎捉虫