2009-05-09 6 views

答えて

2

は私には文字符号化/復号化の問題のように見えます。文字列の書き込みにはReaders/Writersを使用する必要があります。 String.getBytes()String(new byte[])構築物はないのある使用適切道..

あなたが本当に読んで返さバイトがリードバックされ、すべてを保証するために、値を読んで確認するためにループを使用する必要があります!

1

gCompress.close()を使用してfinish()を使用しないことをお勧めします。

str.length()が読み込みに十分長いことに頼ることはできません。データが長くなり、文字列が切り捨てられる危険性があります。

また、read()の戻り値も無視します。 read()はread()に1バイトしか保証されておらず、str.length()バイトのデータを正確に読み取ることはできないため、nulバイト後に\ 0がたくさんある可能性があります。代わりに、あなたはstr.getBytesを読み取ることが期待できる()の長さ()

+0

ちょうどすべての行に間違いがあります。私は最終目標を達成するための* NOT *の完全な例です。 –

5

を他の人が言ったこと繰り返しに:。

  • それはケースがしばしばあることstr.length()= str.getBytes(! ).length()。多くのオペレーティングシステムでは、可変長エンコーディング(UTF-8, UTF-16 or Windows-949など)が使用されています。
  • OutputStream.closeメソッドを使用して、すべてのデータが正しく書き込まれるようにします。
  • InputStream.readの戻り値を使用して、読み取られたバイト数を確認します。すべてのデータを一度に読み取るという保証はありません。
  • Be carefulエンコード/デコードに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)); 
    } 

(これらは、インメモリストリームであるので、私は私が開いたり、それらを閉じ方法についてbeing strictないですので注意してください。)

関連する問題