gpt4 book ai didi

java: 将文件解压成字符串太慢

转载 作者:行者123 更新时间:2023-11-29 06:13:16 24 4
gpt4 key购买 nike

下面是我如何将字符串压缩到一个文件中:

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. 我改变了模式,所以我的代码有点简单,但是如果我不能使用 IOUtils 是否仍然可以使用这个模式?
2. 我按照entonio的建议将StringBuilder buffer设置为2M,是否应该设置多一点?内存还可以,我仍然有大约 10M 可用,因为 eclipse 的堆监视器建议3. 我砍掉了BufferedReader 并添加了一个BufferedInputStream,但我仍然不确定BUFFER_SIZE,有什么建议吗?

上述修改已将我所有 30 个 2M 文件的循环时间从将近 30 秒缩短到大约 14 秒,但我需要将其减少到 10 秒以下,这在 Android 上是否可行?好的,基本上,我需要处理所有 60M 的文本文件,我将它们分成 30 个 2M,在我开始处理每个字符串之前,我做了上面的时间成本计时,只是为了循环所有文件并将文件中的字符串获取到我的内存中。由于我没有太多经验,如果我用1M文件中的60个代替会更好吗?或者我应该采用任何其他改进?谢谢。

另外:由于物理 IO 非常耗时,而且我的压缩版本文件都非常小(2M 文本中大约 2K),我是否仍可以执行上述操作,但是在一个文件上已经映射到内存?可能使用java NIO?谢谢

最佳答案

BufferedReader 的唯一用途是您不使用的 readLine() 方法,所以为什么不直接从 InputStreamReader 读取?此外,也许减小缓冲区大小可能会有所帮助。此外,您可能应该在读取和写入时指定编码,尽管这不会对性能产生影响。

编辑:更多数据

如果您知道前面字符串的大小,您应该在decompressRawText 中添加一个长度参数,并用它来初始化StringBuilder。否则,它会不断调整大小以适应结果,而且代价高昂。

编辑:澄清

2MB 意味着需要进行大量调整。如果您指定的容量大于读取后的最终长度(当然暂时使用更多内存除外),也没有什么坏处。

关于java: 将文件解压成字符串太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6012097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com