Deflater.setLevel() nie działa zgodnie z oczekiwaniami.Czy Deflater.setLevel() działa?
static void test1() throws Exception {
byte[] output = new byte[20];
Deflater compresser = new Deflater();
// compresser.setLevel(Deflater.BEST_COMPRESSION);
compresser.setInput("blah".getBytes("UTF-8"));
compresser.finish();
int len = compresser.deflate(output);
System.out.println("len="+ len+ " " +Arrays.toString(output));
}
Powyższe działa OK dla mnie (Java 7), ale kiedy odkomentuj linię compresser.setLevel()
, przerywa (deflate()
zwraca 0 bajtów). To samo dzieje się z każdym poziomem kompresji, z wyjątkiem DEFAULT
. Mówiąc dokładniej, "działa" (a raczej jest nieszkodliwy), gdy zestaw poziomów jest taki sam, jaki został ustawiony (explicit lub implicit, jak tutaj) w konstruktorze - to znaczy, może być użyty tylko wtedy, gdy jest bezużyteczny.
Zobacz przykład pod adresem Ideone.
This question wskazuje na ten sam problem, a przyjęta odpowiedź w zasadzie mówi: nie ustawiaj poziomu za pomocą settera, zrób to w konstruktorze. Daleko od zadowalającego, IMO - dlaczego istnieje setLevel()
? Czy to jest zepsute, czy coś nam brakuje?
Wygląda na to, że jest to błąd w API 'Deflater' ... Czytając javadoc, nie jest wcale jasne, co naprawdę robi' .finish(). Czy obejście zaproponowane w ostatniej odpowiedzi działa? – fge