JavaでgZipInputStreamを使用して圧縮および圧縮解除を作成しました 少量のデータに対しては問題ありませんが、圧縮後のデータ長が532私の解凍はうまく動作しません。長さが532バイトを超える圧縮データに対してGZIPInputStream圧縮解除がうまく機能しませんでした
おかげ BAPI
JavaでgZipInputStreamを使用して圧縮および圧縮解除を作成しました 少量のデータに対しては問題ありませんが、圧縮後のデータ長が532私の解凍はうまく動作しません。長さが532バイトを超える圧縮データに対してGZIPInputStream圧縮解除がうまく機能しませんでした
おかげ BAPI
は私には文字符号化/復号化の問題のように見えます。文字列の書き込みにはReaders/Writers
を使用する必要があります。 String.getBytes()
。 String(new byte[])
構築物はないのある使用適切道..
あなたが本当に読んで返さバイトがリードバックされ、すべてを保証するために、値を読んで確認するためにループを使用する必要があります!
gCompress.close()を使用してfinish()を使用しないことをお勧めします。
str.length()が読み込みに十分長いことに頼ることはできません。データが長くなり、文字列が切り捨てられる危険性があります。
また、read()の戻り値も無視します。 read()はread()に1バイトしか保証されておらず、str.length()バイトのデータを正確に読み取ることはできないため、nulバイト後に\ 0がたくさんある可能性があります。代わりに、あなたはstr.getBytesを読み取ることが期待できる()の長さ()
ちょうどすべての行に間違いがあります。私は最終目標を達成するための* NOT *の完全な例です。 –
を他の人が言ったこと繰り返しに:。
列圧縮/解凍方法
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));
}
(これらは、インメモリストリームであるので、私は私が開いたり、それらを閉じ方法についてbeing strictないですので注意してください。)
定義「んうまく動作しません "。 –