2013-09-27 13 views
9
public static String compressString(String str) throws IOException{ 
    if (str == null || str.length() == 0) { 
     return str; 
    } 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    GZIPOutputStream gzip = new GZIPOutputStream(out); 
    gzip.write(str.getBytes()); 
    gzip.close(); 
    Gdx.files.local("gziptest.gzip").writeString(out.toString(), false); 
    return out.toString(); 
} 

Kiedy zapisać ten ciąg do pliku i uruchom gunzip -d file.txt w Uniksie, narzeka:Kompresja ciąg do gzip w Javie

gzip: gzip.gz: not in gzip format 
+0

Dlaczego po prostu nie użyjesz [FileOutputStream (zamiast ByteArrayOutputStream)] (http://stackoverflow.com/questions/5994674/java-save-string-as-gzip-file)? Czy próbowałeś, co się wtedy stanie? –

+0

Jest to biblioteka libgdx, która jest biblioteką do obsługi wielu platform. Zapisałem go tylko do pliku, aby rozwiązać problem. Próbowałem wysłać ciąg za pośrednictwem żądania HTTP POST do mojego serwera kolb, ale strona serwera skarżyła się, że ciąg nie jest prawidłowy gzip. – kelorek

+0

Domyślam się, że problemem jest konwersja skompresowanych danych na ciąg znaków. Myślę, że powinieneś traktować wynik jako bajt []. Czy libgdx może zapisać bajt [] do pliku? –

Odpowiedz

11

spróbuje użyć BufferedWriter

public static String compressString(String str) throws IOException{ 
if (str == null || str.length() == 0) { 
    return str; 
} 

BufferedWriter writer = null; 

try{ 
    File file = new File("your.gzip") 
    GZIPOutputStream zip = new GZIPOutputStream(new FileOutputStream(file)); 

    writer = new BufferedWriter(new OutputStreamWriter(zip, "UTF-8")); 

    writer.append(str); 
} 
finally{   
    if(writer != null){ 
    writer.close(); 
    } 
    } 
} 

O przykładowy kod:

public static String compressString(String str) throws IOException{ 
if (str == null || str.length() == 0) { 
    return str; 
} 
ByteArrayOutputStream out = new ByteArrayOutputStream(str.length()); 
GZIPOutputStream gzip = new GZIPOutputStream(out); 
gzip.write(str.getBytes()); 
gzip.close(); 

byte[] compressedBytes = out.toByteArray(); 

Gdx.files.local("gziptest.gzip").writeBytes(compressedBytes, false); 
out.close(); 

return out.toString(); // I would return compressedBytes instead String 
} 
+0

To czyni prawidłowy obiekt gzip. Naprawdę chcę zwrócić ciąg znaków. Czy mogę pominąć zapisywanie pliku? – kelorek

+0

Na przykład spróbuj najpierw: 'ByteArrayOutputStream out = new ByteArrayOutputStream (str.length());' –

+0

To nie działa. – kelorek

2

Spróbuj tego:

//... 

String string = "string"; 

FileOutputStream fos = new FileOutputStream("filename.zip"); 

GZIPOutputStream gzos = new GZIPOutputStream(fos); 
gzos.write(string.getBytes()); 
gzos.finish(); 

//... 
0

Zapisz bajty z zewnątrz z FileOutputStream

FileOutputStream fos = new FileOutputStream("gziptest.gz"); 
fos.write(out.toByteArray()); 
fos.close(); 

out.toString() wydaje się podejrzane, wynik będzie nieczytelny, jeśli nie obchodzi to dlaczego nie wrócić byte [ ], jeśli ci na tym zależy, to będzie lepiej wyglądać jako łańcuch szesnastkowy lub base64.

+0

zgadzam się, chciałbym zwrócić 'byte []' from 'out.toByteArray()' –