Question

J'essaie de lire un fichier binaire distant (par exemple, une image) à partir d'Internet comme ceci:

HttpURLConnection connection = (HttpURLConnection) myUrl.openConnection(); //myUrl - URL object pointing for some location
if(connection.getResponseCode() == 200){
    File temp = File.createTempFile("blabla", fileName); //fileName - string name of file
    FileOutputStream out = new FileOutputStream(temp);
    int fileSize = Integer.parseInt(connection.getHeaderField("content-length"));
    int counter = 0;
    DataInputStream in = new DataInputStream(connection.getInputStream());
    byte ch[] = new byte[1024];
    System.out.println(counter);
    while((counter += in.read(ch)) > 0){
        out.write(ch);
        if(counter == fileSize){
            out.close();
            break;
        }
    }
}

Localement ou avec un serveur Web local (localhost), cela fonctionne parfaitement.

Mais. Ensuite, myUrl est l'URL du fichier sur un serveur Web distant. Il renvoie des résultats inattendus. Par exemple, à partir des sources de fichiers donnés, il semble qu'il répète certains paquets (je pense en raison de la corruption de fichiers précédents ou someting) et le fichier résultant est généralement environ 10% plus volumineux que celui d'origine à cause de cette répétition. Le fichier est donc corrompu et ne peut pas être ouvert correctement avec les visualiseurs d'images.

Comment puis-je résoudre ce problème?

Était-ce utile?

La solution

read ne lit pas nécessairement la totalité du tampon (en particulier s'il se trouve à la fin du flux).

Alors changez votre boucle:

for (;;) {
    int len = in.read(ch);
    if (len == -1) {
        break;
    }
    out.write(ch, 0, len);
}

Peut-être mettre ce code dans une méthode quelque part.

Notez également:

  • Il est inutile d'utiliser DataInputStream ici (bien que readFully soit souvent utile).
  • Fermez toujours les ressources (telles que les flux) avec l'idiome habituel:

    final Resource resource = acquire();
    try {
        use(resource);
    } finally {
        resource.close();
    }
    
  • Cela ne fera probablement pas beaucoup de différence, mais une taille de tampon de 1024 est un peu petite. J'ai tendance à choisir arbitrairement 8192 par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top