La lecture d'une page web en Java IOException Prématuré EOF
Je suis très souvent un "Prématuré EOF' Exception lors de la lecture d'une page web.
Ce qui suit est la StackTrace
java.io.IOException: Premature EOF
at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:556)
at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:600)
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:687)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2968)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at Utilities.getPage(Utilities.java:24) while ((line = rd.readLine()) != null) {
at TalkPage.<init>(TalkPage.java:15)
at Updater.run(Updater.java:65)
Suivant est le getPage() la méthode
public static String getPage(String urlString) throws Exception {
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = rd.readLine()) != null) { //LINE 24
sb.append(line);
}
return sb.toString();
}
Qu'est ce qu'un permature EOFException et pourquoi est-elle présente dans ce cas particulier et comment peut-il être évité?
Quelques autres informations: La taille de la page en cours de lecture est d'environ 20 KO et je suis en train de lire de nombreuses pages dans mon programme ( environ 20 000 )
Vous devez vous connecter pour publier un commentaire.
Cela peut être parce que vous êtes de lire le contenu ligne par ligne et de la dernière ligne du fichier est peut-être manquant un retour, pour signaler la fin de la ligne. Remplacer votre temps avec cette:
Ce pourrait être parce que le serveur est fermer la connexion. J'ai connu exactement le même problème quand j'avais un morceau de code qui ouvre une connexion, n'a d'autres traitements, et seulement puis essayé de télécharger le contenu du flux d'entrée - par le temps à la rivière après avoir passé quelques secondes sur un autre traitement, le serveur n'avait apparemment fermé la connexion, résultant en IOException: Prématuré expressions du FOLKLORE. La solution a été de faire attention à toujours traiter immédiatement le contenu du flux - dans le cas contraire, vous laissant une connexion HTTP ouvrir et de repos, et finalement le serveur à l'autre bout de la ligne va s'accrocher sur vous.
Vous pouvez utiliser APACHE
commons io FileUtils.copyURLToFile
méthodehttp://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#copyURLToFile%28java.net.URL,%20java.io.File,%20int,%20int%29
Vous pouvez également essayer de définir la taille de la mémoire tampon de 1. Cette légèrement aide et si vous avez de mettre en œuvre un essai de logique autour d'elle, puis il devrait faire l'affaire.