J'essaie de lire du texte à partir d'un document Web à l'aide d'un fichier bufferedreader fort> sur une URL (dans le fichier sur certains serveur Apache). Maintenant cela fonctionne juste bien. Mais évidemment, j'aimerais que le lecteur ne suffit pas à lire une ligne, mais autant qu'il y a dans le dossier. I.e. Lisez toutes les lignes pendant qu'il y ait plus de lignes, arrêtez-vous quand il n'y a plus de lignes. Ce code ne fonctionne pas cependant - le lecteur juste i peut même imprimer la valeur prête () juste avant lire une ligne (qui lit la chaîne correcte du fichier) mais le lecteur signalera ' faux em>'. P> suis-je en train de faire quelque chose de mal? Pourquoi la bufferedreader retourne-t-elle ' faux em>' sur prête quand il y a des choses à lire? P> p>
En regardant l'API de bufferedreader, le code suivant doit faire exactement que: p>
7 Réponses :
Une autre façon que vous pouvez faire cela qui contourne le Vous continuerez à lire jusqu'à ce que vous ayez terminé. De cette façon, vous n'avez pas besoin de vous inquiéter du problème avec in.REady () code> est quelque chose comme:
in.ready () code>. P> p>
Je pense que vous avez compromis votre réponse en faisant sonner comme une solution de contournement. Ce que vous avez montré est l'idiome le plus courant pour la lecture d'une bufferedreader, mais plus important encore, c'est correct. À l'aide de la méthode prêt () code> comme l'OP a fait est pas b> correct.
Je pense que le moyen standard d'écrire est de tenter de lire la ligne et de vérifier qu'il est retourné de temps en temps. Quelque chose comme ceci: pour que vous continuiez à aller jusqu'à ce que vous obtenez NULL renvoyé du flux. Voir ici pour des informations supplémentaires: p> http://download.oracle.com/javase/1.5.0/docs/api/java/io/bufferedreader.html#readline () p> p>
Désolé, je ne devrais pas dire «standard», mais plutôt la façon dont j'ai vu le plus souvent.
Également - n'oubliez pas d'utiliser une StringBuffer lors de la construction de grandes chaînes (ou, StringBuilder pour des opérations non synchronisées): download.oracle.com/javase/1.5.0/docs/aplia/java/lang/.../a>
Non, c'est assez standard bien que ce ne soit pas valide Java ( chaîne code> au lieu de
string code> et cette déclaration doit être en dehors de l'expression). L'idiome que j'utilise est
pour (string l = null; (l = in.readlineLine ())! = Null;) { code>
Ah, mon erreur. Obtenir mon c # et java mélangé, je suppose! Désolé pour ça @glenn Nelson.
Disons que c'est la façon la plus confondante comment l'écrire. Il vient de l'époque que les compilateurs C avaient des moments difficiles pour optimiser quoi que ce soit du tout, vous avez donc dû les aider à utiliser des missions comme des valeurs et des choses amusantes similaires. Lorsqu'il est écrit correctement, il conduit à la chaîne visible dans une portée trop importante. Cependant - qu'est-ce que cela a à voir avec prêt () ne fonctionne pas ???
pour (string nextline = lave.readline (); nextline! = null; nulline = reader.readline ()) {} code>
Le Le [retour] alors le indique si ce flux est prêt à être lu. Un flux de caractères tampon est prêt si le tampon n'est pas vide, ou si le flux de caractères sous-jacents est prêt em>. P>
blockQuote>
Si vous mettez ces deux ensemble, il est clair que bufferedreader.ready () code> est comportant comme spécifié: p>
Reader.Ready () Code> Javadoc
dit ce qui suit: p>
true code> si le prochain
lis () code> est garanti de ne pas bloquer pour l'entrée,
false code> sinon. Notez que le retour
faux code> ne garantit pas que la prochaine lecture bloquera. P>
blockQuote>
Bufferedreader.ready () code> Javadoc
dit ce qui suit: p>
bufferedreader.ready () code> peut em> retour
false code> dans des situations où les caractères sont disponibles. En bref, vous ne devriez pas compter sur
prêt () code> pour tester pour la fin de fichier logique ou la fin de flux. P>
prêt ()! = a plus fort> Pour savoir s'il n'y a plus de vérification de données si prêt () code> n'indique pas qu'il y a plus de données à lire. Il ne montre que si une lecture
sera frappe> pourrait bloquer le fil. Il est probable qu'il retournerait faux avant de lire toutes les données. P> readline () code> retourne
null code >. p>
C'est ce que nous utilisons de manière cohérente depuis des années - pas sûr s'il s'agit de la méthode "standard". J'aimerais entendre des commentaires sur les avantages et les inconvénients de l'utilisation directe de l'URL.Openurlstream () et si cela provoque les problèmes de l'OP. Ce code fonctionne pour les connexions HTTP et HTTPS.
URL getURL = new URL (servletURL.toString() + identifier+"?"+key+"="+value); URLConnection uConn = getURL.openConnection(); BufferedReader br = new BufferedReader (new InputStreamReader (uConn.getInputStream())); for (String s = br.readLine() ; s != null ; s = br.readLine()) { System.out.println ("[ServletOut] " + s); // do stuff with s } br.close();
Fondamentalement, la méthode bufferedReader.Ready () peut être utilisée pour vérifier si le flux sous-jacent est prêt à fournir des données à l'appelant de la méthode .... sinon, nous pouvons attendre le fil pendant un certain temps. P >
Mais le vrai problème est qu'après que nous avons complètement lu le flux de données, il va jeter de la fausse .. Nous ne savions donc pas si le flux est complètement lu ou sous-jacent à Stream est occupé .... p>
Bienvenue sur Stackoverflow. Assurez-vous de vérifier comment utiliser Mise en forme de Markdown . Ça va rendre vos réponses plus utilisables pour les autres.
Si vous voulez utiliser IN.Ready (), les suivants ont fonctionné pour moi bien:
for (int i = 0; i < 10; i++) { System.out.println("is InputStreamReader ready: " + in.ready()); if (!in.ready()) { Thread.sleep(1000); } else { break; } }
Pouvez-vous en dire plus sur votre intention?
Je ne sais pas si cela est d'une importance, mais l'URL pointe réellement un emplacement à l'aide de HTTPS. Les certificats sont cependant correctement installés sur le serveur et sur la machine qui exécute le code ci-dessus. De plus, le readline () renvoie la première ligne sans problèmes.
Il sera prêt quand il y a des données en attente, mais il n'aura pas d'attendre des données avant d'effectuer une lecture / readline. Même s'il y a des données en attente, il peut ne pas être une ligne complète, alors readline () bloquera de toute façon.
Lotta Great Answers, Thx tous. Malheureusement, je ne peux que marquer une seule réponse acceptée. :)