У меня есть проблема с временем, требуемым для файлов.gz, чтобы получить несжатый код с помощью следующего кода:
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 Мбайт, но мне все равно требуется десятки минут для запуска, поэтому я пытаюсь получить что-то быстрее. Скорость хорошая :)
Вы создали BufferedInputStream
из GZIPInputStream
, для производительности вы бы сделали это в обратном порядке. Кроме того, я предлагаю вам уменьшить размер вашего буфера (и использовать ваши буферизованные потоки). Наконец, я бы использовал приложение try-with-resources
которое могло бы выглядеть примерно так:
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;
}
n = in.read(buffer,0,n)
. Этот последнийn
кажется неправильным. должен бытьbuffer.length
.