2017-02-11 4 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. Три файла с двумя байтами и один 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 и на других сайтах. Счастливое кодирование.