2017-02-11 46 views
-1

我想将任何类型(音频,视频,图像...)的大文件分块为小块。我尝试了很多算法,但我无法做到这一点。任何人可以建议我一个工作算法?用于任何类型数据的分块算法

+0

你是什么意思?你是否想将任何文件分成几部分,而不是关心内容类型? – MBo

+0

是的,我必须把它切成小块 –

+0

['split'](https://www.gnu.org/software/coreutils/manual/html_node/split-invocation.html)怎么样? –

回答

0

使用下次启动位置只需复制块到小档案:

N = FileSize/ChunkSize //integer division 
RestSize = FileSize % ChunkSize //integer modulo 
for i = 0 to N - 1 
    Copy ChunkSize bytes from position i * ChunkSize into ChunkFile[i] 
if RestSize > 0 
    Copy RestSize bytes from position N * ChunkSize into ChunkFile[N] 

举例:需要划分7个字节的文件转换成2个字节的块。 N = 3,RestSize = 1。三个2字节文件和一个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一些讨论,并在其他网站上。 快乐编码。