Java (Android): попробовать сжатый ввод-вывод и не удалось - PullRequest
1 голос
/ 12 мая 2011

В основном у меня довольно длинный текст, мне нужно сжать его, сохранить в файле и прочитать позже. вот что я сделал.

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();
        }
    }
}

Но строка, которую я получил из сжатого файла, отличается от оригинальной с места на место. Кто-нибудь знает почему? Кстати, моя главная цель состоит в том, чтобы мне нужно было эффективно сжать длинную строку (около 15 МБ) в файл и распаковать ее в основную память на Android. Я пытался просто использовать Object IO в Java, чтобы добиться этого, это достигается без проблем на моем компьютере. Но на андроиде, если строковый объект больше чем 3M, требуется целое время, чтобы привести объект, который я получил от ObjectInputStream к String. Поэтому я пробую другие способы избежать кастинга. Вышесказанное является одной из моих попыток, но, поскольку я мало знаю о NIO, я, вероятно, все делаю неправильно, поэтому кто-нибудь знает более эффективный способ достижения этого, пожалуйста, укажите мне правильное направление, большое спасибо.

1 Ответ

0 голосов
/ 12 мая 2011
  1. Выбросьте FileChannel и просто используйте FileInputStream.Здесь вы на самом деле используете java.io, а не NIO, за исключением случаев, когда вы получаете канал, поэтому вы просто делаете это сложным путем.
  2. Укажите имя набора символов для String.getBytes ().
  3. Сохранить результат чтения (byte []) в переменную.Используйте эту переменную при добавлении в sb, т.е.в массив char [], а не массив byte [], и используйте sb.append (charBuffer, 0, count).Это позволяет избежать предположения о том, что в настоящее время считываемые вами байты составляют целую строку.
...