2009-05-09 7 views

Répondre

2

On dirait un problème de codage de caractères/décodage pour moi. Vous devez utiliser Readers/Writers pour écrire des chaînes, par ex. . En utilisant String(new byte[]) constructions sont pas la bonne façon ..

Vous devriez vraiment utiliser une boucle pour lire et vérifier les retournés octets lus valeur pour assurer que tout est relue!

1

Je vous suggère d'utiliser gCompress.close() not finish();

Je suggère également que vous ne pouvez pas compter sur str.length() étant assez long pour lire. Les données risquent d'être plus longues et la chaîne sera tronquée.

Vous ignorez également la valeur de retour de read(). read() est seulement garanti pour read() un octet et il est peu probable qu'il lise exactement str.length() octets de données, donc vous aurez probablement beaucoup d'octets nuls de fin \ 0. vous pourriez plutôt nous attendre à lire la longueur()

+0

À peu près chaque ligne a une erreur - c'est un exemple parfait de la façon dont * PAS * pour atteindre l'objectif final. –

5

str.getBytes() Pour réitérer ce que les autres ont dit:.

  • Il est souvent le cas que str.length() = str.getBytes (!) .length(). De nombreux systèmes d'exploitation utilisent un codage à longueur variable (par exemple UTF-8, UTF-16 or Windows-949).
  • Utilisez les méthodes OutputStream.close pour vous assurer que toutes les données sont écrites correctement.
  • Utilisez la valeur de retour du InputStream.read pour connaître le nombre d'octets lus. Il n'y a aucune garantie que toutes les données seront lues en une fois.
  • Be careful lors de l'utilisation de la classe String pour le codage/décodage.

Cordes méthodes de compression/décompression

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

(Notez que parce que ce sont des flux en mémoire, je ne suis pas being strict sur la façon dont j'ouvrir ou les fermer.)

Questions connexes