gpt4 book ai didi

java(安卓): try compressed I/O and failed

转载 作者:行者123 更新时间:2023-12-01 05:45:41 24 4
gpt4 key购买 nike

基本上我有一个相当长的文本,我需要将其压缩,将其存储在文件中,并稍后读出。这就是我所做的。

public static void outCompressNIO(String outFile, String src) {
FileChannel fc = null;
GZIPOutputStream gz = null;
try {
fc = new FileOutputStream(outFile).getChannel();
gz = new GZIPOutputStream(Channels.newOutputStream(fc));
gz.write(src.getBytes());
gz.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
gz.close();
fc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

public static void inCompressNIO(String inFile) {
FileChannel fc = null;
GZIPInputStream gz = null;
try {
fc = new FileInputStream(inFile).getChannel();
gz = new GZIPInputStream(Channels.newInputStream(fc));
byte fileContent[] = new byte[1024];
StringBuilder sb = new StringBuilder();
while ((gz.read(fileContent)) != -1) {
sb.append(new String(fileContent));
}
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
gz.close();
fc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

但是我从压缩文件中返回的字符串与原始的字符串各地都不同。有人知道为什么吗?顺便说一句,我的主要目标是我需要有效地将一个长字符串(大约15M)压缩到一个文件中,并将其解压缩到android上的主内存中。我尝试在java中使用Object IO来实现这一点,在我的电脑上实现没有问题。但在android上,如果字符串对象超过3M,则需要很长时间才能将我从ObjectInputStream获得的对象转换为String。所以我正在尝试其他方法来避免类型转换。以上是我的尝试之一,但由于我对 NIO 知之甚少,我可能做错了,所以任何人都知道更有效的方法来实现这一目标,请为我指出正确的方向,非常感谢。

最佳答案

  1. 抛弃FileChannel,只使用FileInputStream。您在这里实际上使用的是 java.io,而不是 NIO,除非您获取 channel ,所以您只是在以困难的方式进行操作。
  2. 为 String.getBytes() 指定字符集名称。
  3. 将 read(byte[]) 的结果存储到变量中。追加到 sb 时使用该变量,即 sb.append(new String(buffer,0,count, charset));
  4. 更好的是,在 GZipInputStream 周围包装一个 InputStreamReader,使用相同的字符集名称构造,读入 char[] 数组,而不是 byte[] 数组,并使用 sb.append(charBuffer, 0, count)。这避免了您当前所读取的字节构成整个字符串的假设。

关于java(安卓): try compressed I/O and failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5971436/

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