MENU

【Java开发札记】将两个破碎的文件融合成一个

August 29, 2017 • Read: 53 • 瞎折腾

今天在看颠倒的帕特玛之前,我发现由迅雷下载的、卡在99.9%进度的文件,正片对应的文件有两个。一个是.bt.td结尾,另一个是.bt.xltd结尾。我通过HxD编辑器看到两个文件内都有各不相同的0填充的区域,应该是没有下载到数据的区域,还有各不相同的填充了数据的区域,即下载到了数据的区域。

因此我想能不能让他们两个互补一下,取并集成为一个兼顾二者所下载到的数据的视频文件呢?

看这篇文章之前,请各位跟我念: J A V A 大 法 好 !

整体的代码很简单,因为两个文件对应的都是同一个文件,因而数据的序列是相同的。因此针对x位上面的数据,让Java分别读取两个文件,如果一样就写进去,不一样的话取非0的那个写进去。从头到尾捋一遍,这文件不就拼好了嘛!

代码如下:

package info.skyblond.fuse;

import java.io.*;

public class Main {
    public static String target = "D:\\fuse\\[J.X&MGRT]Sakasama no Patema.1080p.10bit.mkv";
    public static String sourcetd = "D:\\fuse\\bt.td";
    public static String sourcexlxltd = "D:\\fuse\\bt.xltd";
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream1 = new FileInputStream(new File(sourcetd));
        FileInputStream fileInputStream2 = new FileInputStream(new File(sourcexlxltd));
        FileOutputStream fileOutputStream = new FileOutputStream(new File(target));
        byte[] td = new byte[1024]; 
        byte[] xltd = new byte[1024];
        byte[] write = new byte[1024];
        while(true) {
            int len1 = fileInputStream1.read(td);
            int len2 = fileInputStream2.read(xltd);
            if(len1 == -1 && len2 == -1)
                break;
            for(int x = 0; x < 1024; x++){
                if(td[x] >= xltd[x])
                    write[x] = td[x];
                else
                    write[x] = xltd[x];
            }
            fileOutputStream.write(write);
            td = new byte[1024]; 
            xltd = new byte[1024];
            write = new byte[1024];
        }
        fileOutputStream.close();
    }
}

程序整体的思路就是如上所述,但是实现的时候并不是一个一个字节的读,那样的话机械硬盘恐怕就要爆炸了。对于byte[]的长度,有经验的老司机一看就知道是缓存用的。一开始我用了1GB做缓存,先连续读两个GB的数据,然后处理完之后一口气写1GB,贼快,机械硬盘也贼开心。但是移动硬盘就不开心了啊,这样做的话你3.12GB的文件丢进出,出来的只能是1GB的整倍数,也就是4GB,整整将近1GB全是0填充的,占地方啊!

因此我将缓存调整了喜闻乐见的1024字节。当然,如果你用的ssd且不在乎硬盘损伤的话,你可以直接把数组换成单个的变量,那样出来的文件绝不会有任何多余之处,只是硬盘嘛。。。可能磁头有句mmp要讲。

好啦,这就是这次的Java开发札记。自己动手丰衣足食,轮子再累也要造,不是嘛2333


知识共享许可协议
【Java开发札记】将两个破碎的文件融合成一个天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://www.skyblond.info/about.html 处获得。

Tags: java
Archives QR Code Tip
QR Code for this page
Tipping QR Code
0:00