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

标签 java android zip compression

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

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/

相关文章:

java - Java 中更快的埃拉托斯特尼筛法和素数分解

java - 使用 java 的 HTTP 补丁请求

java - 是否可以在 android/iOS 中向 FCM 通知添加图像图标?

python - python 中的 Zip 不适用于列表

android - 在 Xamarin Forms Android 中创建 Zip 文件

java.util.zip.ZipException : invalid CEN header (bad signature)

Java for 循环迭代

java - 打印边距在 Eclipse 中显示不正确

android - PrintWriter 是否有某种内部缓冲区?

java - 我应该如何在我的 Android 应用程序的 REST API 代码中使用字符串?