2009-05-09 3 views

Antwort

2

Sieht aus wie ein char-Codierung/Decodierung Problem für mich. Man sollte Readers/Writers verwenden, um Strings zu schreiben, z. String.getBytes(). Mit String(new byte[]) Konstrukte sind nicht die richtige Weg ..

Sie sollten wirklich eine Schleife verwenden, um die zurückgegebenen Bytes alles, um sicherzustellen, lesen Wert zu lesen und prüfen ist, lesen Sie zurück!

1

Ich würde vorschlagen, Sie gCompress.close() not finish();

Ich schlage auch vor, dass Sie sich nicht darauf verlassen können, dass str.length() lang genug zum Lesen ist. Es besteht das Risiko, dass die Daten länger sind und der String daher abgeschnitten wird.

Sie ignorieren auch den Rückgabewert von read(). read() wird nur garantiert, um ein Byte zu lesen und es ist unwahrscheinlich, dass es genau str.length() Datenbytes liest, so dass Sie wahrscheinlich viele abschließende nul Bytes \ 0 haben. Stattdessen könnte man erwarten str.getBytes() length()

+0

Fast jede Zeile hat einen Fehler - ein perfektes Beispiel dafür, wie * NOT * das Endziel erreicht. –

5

Um es zu wiederholen, was andere gesagt haben zu lesen.

  • Es ist oft der Fall, dass str.length() = str.getBytes (!) .length(). Viele Betriebssysteme verwenden eine Codierung mit variabler Länge (wie UTF-8, UTF-16 or Windows-949).
  • Verwenden Sie OutputStream.close Methoden, um sicherzustellen, dass alle Daten korrekt geschrieben werden.
  • Verwenden Sie den Rückgabewert der InputStream.read, um zu sehen, wie viele Bytes gelesen wurden. Es gibt keine Garantie, dass alle Daten auf einmal gelesen werden.
  • Be careful bei Verwendung der String-Klasse für die Codierung/Decodierung.

String-Kompression/Dekompression Methoden

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)); 
    } 

(Beachten Sie, dass, da diese im Speicher Ströme sind, bin ich nicht being strict darüber, wie ich öffnen oder schließen.)

Verwandte Themen