Сжатие и распаковка строки в Java - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь сжать и распаковать строку из среды производителя и потребителя (которая принимает только строку в качестве параметров).

Итак, после сжатия строки я преобразую сжатый байтовый массив в строку и затем передаю его производителю.Затем в потребительской части я возвращаю строку обратно, преобразовываю в байтовый массив и затем распаковываю строку из байтов.

Вместо преобразования в строку, если я использовал byte [], то он работает нормально.Но что мне нужно, это преобразовать в строку и наоборот.

Вот мой код:

public class Compression {

public static void main(String[] args) throws Exception{
    // TODO Auto-generated method stub

    String strToCompress = "Helloo!! ";
    byte[] compressedBytes = compress(strToCompress);

    String compressedStr = new String(compressedBytes, StandardCharsets.UTF_8);
    byte[] bytesToDecompress = compressedStr.getBytes(StandardCharsets.UTF_8);

    String decompressedStr = decompress(bytesToDecompress);

    System.out.println("Compressed Bytes : "+Arrays.toString(compressedBytes));

    System.out.println("Decompressed String : "+decompressedStr);

}

public static byte[] compress(final String str) throws IOException {
    if ((str == null) || (str.length() == 0)) {
      return null;
    }
    ByteArrayOutputStream obj = new ByteArrayOutputStream();
    GZIPOutputStream gzip = new GZIPOutputStream(obj);
    gzip.write(str.getBytes("UTF-8"));
    gzip.flush();
    gzip.close();
    return obj.toByteArray();
  }

  public static String decompress(final byte[] compressed) throws IOException {
    final StringBuilder outStr = new StringBuilder();
    if ((compressed == null) || (compressed.length == 0)) {
      return "";
    }
    if (isCompressed(compressed)) {   //It is not going into this if part
      final GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(compressed));
      final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gis, "UTF-8"));

      String line;
      while ((line = bufferedReader.readLine()) != null) {
        outStr.append(line);
      }
    } else {
      outStr.append(compressed);
    }
    return outStr.toString();
  }

  public static boolean isCompressed(final byte[] compressed) {
    return (compressed[0] == (byte) (GZIPInputStream.GZIP_MAGIC)) && (compressed[1] == (byte) (GZIPInputStream.GZIP_MAGIC >> 8));
  }

}

1 Ответ

0 голосов
/ 25 ноября 2018

Вы не можете предполагать, что сжатая строка может рассматриваться как UTF-8, так как многие возможные комбинации байтов не являются допустимыми UTF-8.Я предлагаю попробовать ISO-8859-1, который сохраняет все 8-битные значения непереведенными.

Также обратите внимание, что хотя большие фрагменты текста должны уменьшаться, небольшие строки могут увеличиваться.

Примечание. ЭтоЦикл удалит любые символы новой строки

  String line;
  while ((line = bufferedReader.readLine()) != null) {
    outStr.append(line);
  }

. Я предлагаю вместо этого копировать, используя char[], который не пропустит никаких символов.

 char[] chars = new char[512];
 for(int len; (len = reader.read(chars)) > 0;)
     outStr.append(chars, 0, len);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...