Frage

Ich versuche, eine Remote -Binärdatei (sagen wir, Bild) aus dem Internet wie folgt zu lesen:

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

Vor Ort mit lokalem Webserver (Localhost) funktioniert es perfekt.

Aber. Dann ist Myurl URL der Datei auf einem Remote -Webserver - sie gibt unerwartete Ergebnisse zurück. Zum Beispiel scheint es aus Quellen gegebener Dateien, dass es einige Pakete wiederholt (ich denke, aufgrund der Korruption früherer oder etwas anderes), und die resultierende Datei ist aufgrund dieser Wiederholungen normalerweise etwa 10% größer als original. Die Datei ist also beschädigt und kann nicht korrekt mit Image -Betrachtern geöffnet werden.

Wie kann ich das lösen?

War es hilfreich?

Lösung

read Lesen Sie nicht unbedingt den gesamten Puffer (insbesondere wenn er am Ende des Stroms befindet).

Ändern Sie also Ihre Schleife:

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

Stellen Sie diesen Code vielleicht irgendwo in eine Methode ein.

Beachten Sie auch:

  • Es macht keinen Sinn, zu verwenden DataInputStream hier (obwohl readFully ist oft nützlich).
  • Immer Ressource (wie Streams) mit dem üblichen Idiom schließen:

    final Resource resource = acquire();
    try {
        use(resource);
    } finally {
        resource.close();
    }
    
  • Wahrscheinlich wird es wahrscheinlich nicht viel Unterschied machen, aber eine Puffergröße von 1024 ist etwas klein. Ich neige dazu, beliebig 8192 in Verzug zu bringen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top