Чтобы повторить то, что сказали другие:
- Часто бывает так, что str.length ()! = Str.getBytes (). Length () . Многие операционные системы используют кодирование переменной длины (например, UTF-8, UTF-16 или Windows-949 ).
- Используйте OutputStream.close методы, чтобы гарантировать, что все данные записаны правильно.
- Используйте возвращаемое значение InputStream.read , чтобы увидеть, сколько байтов было прочитано. Нет гарантии, что все данные будут прочитаны за один раз.
- Будьте осторожны при использовании класса String для кодирования / декодирования.
Методы сжатия / распаковки строк
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));
}
(Обратите внимание, что, поскольку это потоки в памяти, я не являюсь строгим в отношении того, как их открывать или закрывать.)