Ich versuche, eine Remote-Binär-Datei (zB Bild) aus dem Internet wie folgt zu lesen:Unerwartetes Ergebnis von HttpURLConnection - Lesen Remote-Binärdatei
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;
}
}
}
Lokal von mit lokalem Web-Server (localhost) es funktioniert perfekt.
Aber. Dann ist myUrl die URL der Datei auf einem entfernten Webserver - es gibt unerwartete Ergebnisse zurück. Zum Beispiel scheint es aus Quellen von bestimmten Dateien, dass es einige Pakete wiederholt (ich denke wegen der Korruption von früheren oder etwas) und die resultierende Datei ist wegen dieser Wiederholungen normalerweise etwa 10% größer als die ursprüngliche Datei. Die Datei ist also beschädigt und kann nicht korrekt mit Bildbetrachtern geöffnet werden.
Wie kann ich das lösen?
Gerade für die Fertigstellung, bevorzugen die meisten Java-Programmierer die kürzere Variante: \t int len; \t während ((len = in.read (ch))> = 0) { \t \t out.write (ch, 0, len); \t} Speichert eine Bedingung, eine Pause und wiederverwendet die Variable auf dem Stapel, die es ein wenig weniger fehleranfällig macht. –
A bevorzugen, Nebenwirkungen zu vermeiden. Die Wiederverwendung von Variablen ist keine Best-Practice! –