用于任何类型数据的分块算法

时间:2017-02-11 16:45:15

标签: algorithm file byte chunks chunking

我想把任何类型的大型文件(音频,视频,图像......)分成小块。我尝试了很多算法,但我无法做到这一点。任何人都可以建议我使用算法吗?

2 个答案:

答案 0 :(得分:0)

只需使用下一个开始位置将块复制到小文件中:

<?php
if ("" != trim($_FILES['fileToWrite']["tmp_name"])) {
    if (!file_exists($_FILES['fileToWrite']["tmp_name"])) {
        echo "File named: <span style='color:red;'>" . $_POST['fileToWrite'] . "</span> doesn't exist! <br>";
    } else {
        $fw = fopen($_FILES['fileToWrite']["tmp_name"], "w");
        fwrite($fw, $_POST['write_file']);
        echo 'File over-written successfully';
    }
}
?>

示例:需要将7个字节的文件分成2个字节的块。 N = 3,RestSize = 1.三个2字节文件和一个1字节。

答案 1 :(得分:0)

即使我们有这样的记忆,你也无法一次性阅读大块文件。基本上对于每个拆分,您可以读取一个固定大小的字节数组,您知道在性能和内存方面应该是可行的。

 public static void main(String[] args) throws Exception
        {
            RandomAccessFile raf = new RandomAccessFile("test.csv", "r");
            long numSplits = 10; //from user input, extract it from args
            long sourceSize = raf.length();
            long bytesPerSplit = sourceSize/numSplits ;
            long remainingBytes = sourceSize % numSplits;

            int maxReadBufferSize = 8 * 1024; //8KB
            for(int destIx=1; destIx <= numSplits; destIx++) {
                BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("split."+destIx));
                if(bytesPerSplit > maxReadBufferSize) {
                    long numReads = bytesPerSplit/maxReadBufferSize;
                    long numRemainingRead = bytesPerSplit % maxReadBufferSize;
                    for(int i=0; i<numReads; i++) {
                        readWrite(raf, bw, maxReadBufferSize);
                    }
                    if(numRemainingRead > 0) {
                        readWrite(raf, bw, numRemainingRead);
                    }
                }else {
                    readWrite(raf, bw, bytesPerSplit);
                }
                bw.close();
            }
            if(remainingBytes > 0) {
                BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("split."+(numSplits+1)));
                readWrite(raf, bw, remainingBytes);
                bw.close();
            }
                raf.close();
        }

        static void readWrite(RandomAccessFile raf, BufferedOutputStream bw, long numBytes) throws IOException {
            byte[] buf = new byte[(int) numBytes];
            int val = raf.read(buf);
            if(val != -1) {
                bw.write(buf);
            }
        }

您还应该在https://coderanch.com/t/458202/java/Approach-split-file-chunks和其他网站等各种网站上寻找一些讨论。 快乐的编码。