Próbuję napisać klasę, która może kompresować dane. Poniższy kod kończy się niepowodzeniem (nie jest zgłaszany wyjątek, ale docelowy plik .gz jest pusty).
Poza tym: Nie chcę generować pliku .gz bezpośrednio, tak jak w przypadku wszystkich przykładów. Chcę tylko uzyskać skompresowane dane, które umożliwią mi np. zaszyfruj go przed zapisaniem danych do pliku.Kompresja GZIP do tablicy bajtów
Jeśli piszę bezpośrednio do pliku wszystko działa poprawnie:
import java.io.*;
import java.util.zip.*;
import java.nio.charset.*;
public class Zipper
{
public static void main(String[] args)
{
byte[] dataToCompress = "This is the test data."
.getBytes(StandardCharsets.ISO_8859_1);
GZIPOutputStream zipStream = null;
FileOutputStream fileStream = null;
try
{
fileStream = new FileOutputStream("C:/Users/UserName/Desktop/zip_file.gz");
zipStream = new GZIPOutputStream(fileStream);
zipStream.write(dataToCompress);
fileStream.write(compressedData);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try{ zipStream.close(); }
catch(Exception e){ }
try{ fileStream.close(); }
catch(Exception e){ }
}
}
}
Ale jeśli chcę „obejścia” go do tablicy bajtów strumieniowo go nie wytwarzać jeden bajt - compressedData
jest zawsze pusty.
import java.io.*;
import java.util.zip.*;
import java.nio.charset.*;
public class Zipper
{
public static void main(String[] args)
{
byte[] dataToCompress = "This is the test data."
.getBytes(StandardCharsets.ISO_8859_1);
byte[] compressedData = null;
GZIPOutputStream zipStream = null;
ByteArrayOutputStream byteStream = null;
FileOutputStream fileStream = null;
try
{
byteStream = new ByteArrayOutputStream(dataToCompress.length);
zipStream = new GZIPOutputStream(byteStream);
zipStream.write(dataToCompress);
compressedData = byteStream.toByteArray();
fileStream = new FileOutputStream("C:/Users/UserName/Desktop/zip_file.gz");
fileStream.write(compressedData);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try{ zipStream.close(); }
catch(Exception e){ }
try{ byteStream.close(); }
catch(Exception e){ }
try{ fileStream.close(); }
catch(Exception e){ }
}
}
}
"* Poniższy kod kończy się niepowodzeniem *" nie jest prawidłowym komunikatem o błędzie Java. –
Dołącz także ślad stosu z błędu. –
Po prostu generuje plik, który nie jest archiwum ZIP. Nie ma komunikatu o błędzie. –