這裏是我壓縮串入一個文件:的java:decomprss文件轉換成字符串太慢
public static void compressRawText(File outFile, String src) {
FileOutputStream fo = null;
GZIPOutputStream gz = null;
try {
fo = new FileOutputStream(outFile);
gz = new GZIPOutputStream(fo);
gz.write(src.getBytes());
gz.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
gz.close();
fo.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
這是我如何解壓縮它:
static int BUFFER_SIZE = 8 * 1024;
static int STRING_SIZE = 2 * 1024 * 1024;
public static String decompressRawText(File inFile) {
InputStream in = null;
InputStreamReader isr = null;
StringBuilder sb = new StringBuilder(STRING_SIZE);//constant resizing is costly, so set the STRING_SIZE
try {
in = new FileInputStream(inFile);
in = new BufferedInputStream(in, BUFFER_SIZE);
in = new GZIPInputStream(in, BUFFER_SIZE);
isr = new InputStreamReader(in);
char[] cbuf = new char[BUFFER_SIZE];
int length = 0;
while ((length = isr.read(cbuf)) != -1) {
sb.append(cbuf, 0, length);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
return sb.toString();
}
減壓似乎永遠採取做。我有一種感覺,我在解壓縮位上做了太多的冗餘步驟。任何想法我可以加快它?
編輯:已經修改了代碼,基於以下給出的建議以上,
1.我chaged模式,所以簡單地我的代碼了一下,但如果我不能使用IOUtils
是這個還行使用這種模式?
2.我將StringBuilder緩衝區設置爲2M,正如entonio
建議的那樣,我應該將它設置得多一點嗎?內存還行,我仍然有10M左右可用,因爲它是由偏食 3.堆監視我切的BufferedReader,並添加了的BufferedInputStream建議,但我仍然不能確定BUFFER_SIZE,有什麼建議?
上述修改改進了將所有30個2M文件從30秒縮短到14個左右所需的時間,但我需要將其縮短到10個以下,甚至可以在android上執行?好吧,基本上,我需要在60M內處理一個文本文件,我已經將它們分成了30個2M,並且在我開始處理每個字符串之前,我對上述時間成本進行了上述計時,只是爲了循環所有文件並將文件中的字符串存入我的內存中。由於我沒有太多經驗,如果我使用60個1M文件,會更好嗎?或者我應該採取其他改進措施?謝謝。
另外:由於物理IO非常耗時,而且由於我壓縮的文件版本都很小(從2M文本大約2K左右),是否可以繼續執行上述操作,但是對於一個文件已經映射到內存?可能使用java的NIO?謝謝
你的字符串有多大? – 2011-05-16 00:02:27
除了不關閉你的輸入流(資源泄漏)和使用平臺默認字符集(有風險),我沒有看到任何代碼的主要錯誤。這個字符串有多大? (請注意,由於您已經使用數組讀取,BufferedReader在代碼中沒有用處)。 – jtahlborn 2011-05-16 00:05:47
對不起,忘了提及,字符串是2M,但我在android上這樣做,我測試了它,它是可行的,但需要很長時間。我已經修復了關閉部分。 – user685275 2011-05-16 00:10:48