Я создал сжатие и распаковку с помощью gZipInputStream в java. Он отлично работает для небольшого объема данных, но если длина данных после сжатия становится больше 532, моя распаковка не работает нормально.
Спасибо, Бапи.
Я создал сжатие и распаковку с помощью gZipInputStream в java. Он отлично работает для небольшого объема данных, но если длина данных после сжатия становится больше 532, моя распаковка не работает нормально.
Спасибо, Бапи.
Чтобы повторить то, что сказали другие:
Методы сжатия/распаковки строк
private static byte[] compress(String str, Charset charset) {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try {
OutputStream deflater = new GZIPOutputStream(buffer);
deflater.write(str.getBytes(charset));
deflater.close();
} catch (IOException e) {
throw new IllegalStateException(e);
}
return buffer.toByteArray();
}
private static String decompress(byte[] data,
Charset charset) {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(data);
try {
InputStream inflater = new GZIPInputStream(in);
byte[] bbuf = new byte[256];
while (true) {
int r = inflater.read(bbuf);
if (r < 0) {
break;
}
buffer.write(bbuf, 0, r);
}
} catch (IOException e) {
throw new IllegalStateException(e);
}
return new String(buffer.toByteArray(), charset);
}
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
while (sb.length() < 10000) {
sb.append("write the data here \u00A3");
}
String str = sb.toString();
Charset utf8 = Charset.forName("UTF-8");
byte[] compressed = compress(str, utf8);
System.out.println("String len=" + str.length());
System.out.println("Encoded len="
+ str.getBytes(utf8).length);
System.out.println("Compressed len="
+ compressed.length);
String decompressed = decompress(compressed, utf8);
System.out.println(decompressed.equals(str));
}
(Обратите внимание: поскольку это потоки в памяти, я не строгий подход к их открытию и закрытию.)
Я бы посоветовал вам использовать gCompress.close(), а не finish();
Я также предлагаю вам не полагаться на то, что str.length() будет достаточно длинным для чтения. Существует риск, что данные могут быть длиннее, поэтому строка будет усечена.
Вы также игнорируете возвращаемое значение read(). read() гарантированно будет читать() только один байт и вряд ли будет читать ровно байты данных str.length() , поэтому у вас, вероятно, будет много завершающих нулевых байтов \0. Вместо этого вы можете ожидать прочитать str.getBytes().length()
Для меня это похоже на проблему с кодировкой/декодированием символов. Следует использовать Readers/Writers для записи строк, например. String.getBytes(). Использование конструкций String(new byte[]) не является правильным способом..
Вы действительно должны использовать цикл для чтения и проверки возвращаемого значения bytes read value, чтобы убедиться, что все считано обратно!