2013-09-27 82 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(); 
} 

給gzip當我保存這個字符串到一個文件,並運行在UNIX gunzip -d file.txt,它抱怨:壓縮字符串中的Java

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

爲什麼不簡單地使用[FileOutputStream(代替ByteArrayOutputStream)](http://stackoverflow.com/questions/5994674/java-save-string-as-gzip-file)?你有沒有嘗試過會發生什麼? –

+0

它是libgdx,它是一個跨平臺的遊戲開發庫。我只將它寫入文件進行故障排除。我實際上一直試圖通過http POST請求將字符串發送到我的燒錄服務器,但服務器端抱怨字符串不是有效的gzip。 – kelorek

+0

我想問題是你的壓縮數據轉換爲字符串。我認爲你應該將結果視爲一個字節[]。 libgdx可以將一個字節[]寫入文件嗎? –

回答

11

嘗試使用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(); 
    } 
    } 
} 

關於您的代碼示例請嘗試:

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

這使得一個有效的gzip對象。我真的很想返回一個字符串。我可以繞過寫文件嗎? – kelorek

+0

對於你的例子,首先嚐試:'ByteArrayOutputStream out = new ByteArrayOutputStream(str.length());' –

+0

這是行不通的。 – kelorek

2

試一下:

//... 

String string = "string"; 

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

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

//... 
0

保存字節從出與FileOutputStream中

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

out.toString()似乎可疑,結果將是不可讀的,如果你不小心,那麼爲什麼不返回字節[ ],如果你真的關心它會看起來更好,因爲十六進制或base64字符串。

+0

同意,我會從'out.toByteArray()'返回'byte []''' –