2015-01-23 5 views
1

У меня есть проблемы со временем он требует для .gz файлов, чтобы получить распакованы, используя следующий код:Оптимизация процесса Ungunzipping в Java?

import java.io.*; 
import java.util.zip.*; 

public class UnGunzipClass{ 

    public static boolean ungunzip(String compressedFile, String decompressedFile){ 

     try{ 

      // in 
      FileInputStream fileIn   = new FileInputStream(compressedFile); 
      GZIPInputStream gZipIn   = new GZIPInputStream(fileIn); 
      BufferedInputStream in   = new BufferedInputStream(gZipIn); 

      // out 
      FileOutputStream fileOut  = new FileOutputStream(decompressedFile); 
      BufferedOutputStream out  = new BufferedOutputStream(fileOut); 

      int n = 0; 
      int len = 1024*1024*1024; 
      byte[] buffer = new byte[len]; 

      while((n = in.read(buffer,0,len)) > 0){ 
       out.write(buffer,0,n); 
      } 

      gZipIn.close(); 
      fileOut.close(); 

      return true; 

     } catch (IOException e){ 
      e.printStackTrace(); 
      return false; 
     } 
    } 
} 

Примечание: Файлы до 100 МБ, но она все еще принимает меня десятки минут, чтобы бежать, поэтому я пытаюсь получить что-то быстрее. Скорость хорошая :)

+1

вам действительно нужен буфер памяти 1 Гб (не то, что это имеет значение По скорости) делать? – Thilo

+0

'n = in.read (buffer, 0, n)'. Это последнее 'n' кажется неправильным. должен быть 'buffer.length'. – Thilo

+0

Это даже работает? Если вы начинаете с 'n = 0', согласно документам, он не должен читать байты и выходить из цикла. – Thilo

ответ

2

Вы создали свой BufferedInputStream от GZIPInputStream, для исполнения вы сделали бы это в обратном порядке. Кроме того, я предлагаю вам уменьшить размер вашего буфера (и использовать ваши буферизованные потоки). Наконец, я хотел бы использовать try-with-resources Statement и что может выглядеть как

public static boolean ungunzip(String compressedFile, 
     String decompressedFile) { 
    final int BUFFER_SIZE = 32768; 
    try (InputStream in = new GZIPInputStream(new BufferedInputStream(
      new FileInputStream(compressedFile)), BUFFER_SIZE); 
      OutputStream out = new BufferedOutputStream(
        new FileOutputStream(decompressedFile), BUFFER_SIZE)) { 
     int n = 0; 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     while ((n = in.read(buffer, 0, BUFFER_SIZE)) > 0) { 
      out.write(buffer, 0, n); 
     } 
     return true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 
+0

Это все еще медленно, но я думаю, это так же быстро, как и получается :) спасибо! –