Lecture du contenu du site Web dans une chaîne
Actuellement, je suis en train de travailler sur une classe qui peut être utilisé pour lire le contenu du site web spécifié par l'url. Je suis juste au début de mes aventures avec java.io
et java.net
j'ai donc besoin de consulter mon design.
Utilisation:
TextURL url = new TextURL(urlString);
String contents = url.read();
Mon code:
package pl.maciejziarko.util;
import java.io.*;
import java.net.*;
public final class TextURL
{
private static final int BUFFER_SIZE = 1024 * 10;
private static final int ZERO = 0;
private final byte[] dataBuffer = new byte[BUFFER_SIZE];
private final URL urlObject;
public TextURL(String urlString) throws MalformedURLException
{
this.urlObject = new URL(urlString);
}
public String read()
{
final StringBuilder sb = new StringBuilder();
try
{
final BufferedInputStream in =
new BufferedInputStream(urlObject.openStream());
int bytesRead = ZERO;
while ((bytesRead = in.read(dataBuffer, ZERO, BUFFER_SIZE)) >= ZERO)
{
sb.append(new String(dataBuffer, ZERO, bytesRead));
}
}
catch (UnknownHostException e)
{
return null;
}
catch (IOException e)
{
return null;
}
return sb.toString();
}
//Usage:
public static void main(String[] args)
{
try
{
TextURL url = new TextURL("http://www.flickr.com/explore/interesting/7days/");
String contents = url.read();
if (contents != null)
System.out.println(contents);
else
System.out.println("ERROR!");
}
catch (MalformedURLException e)
{
System.out.println("Check you the url!");
}
}
}
Ma question est:
Est-ce un bon moyen pour obtenir ce que je veux? Sont-il de meilleures solutions?
Je n'ai pas comme sb.append(new String(dataBuffer, ZERO, bytesRead));
mais je n'étais pas capable de l'exprimer d'une manière différente. Est-il bon de créer une nouvelle Chaîne à chaque itération? Je suppose que non.
Tout autre point faible?
Merci d'avance!
source d'informationauteur Maciej Ziarko
Vous devez vous connecter pour publier un commentaire.
Envisager d'utiliser
URLConnection
à la place. En outre, vous pourriez vouloir tirer profitIOUtils
de Apache Commons IO pour que la chaîne de la lecture plus facile. Par exemple:Si vous ne souhaitez pas utiliser
IOUtils
je serais probablement réécrire la ligne au-dessus de quelque chose comme:Je recommande fortement d'utiliser une bibliothèque dédiée, comme HtmlParser:
D'écrire votre propre code html parser est une perte de temps. Voici sa dépendance maven. Regardez sa JavaDoc pour creuser dans ses fonctions.
L'échantillon doit être convaincant:
À moins que c'est une sorte d'exercice que vous voulez de code pour l'amour de l'apprentissage ... je ne voudrais pas réinventer la roue et je voudrais utiliser HttpURLConnection.
HttpURLConnection
fournit une bonne encapsulation des mécanismes pour faire face avec le protocole HTTP. Par exemple, votre code ne fonctionne pas avec des redirections HTTP,HttpURLConnection
de corriger pour vous.Vous pouvez envelopper votre
InputStream
dans unInputStreamReader
et peut utiliser c'estread()
méthode pour lire des données de caractère directement (notez que vous devrait spécifier l'encodage lors de la création de laReader
mais pour trouver le codage de l'arbitraire Url est non-trivial). Puis il suffit d'appelersb.append()
avec lechar[]
que vous venez de lire (et le décalage correct et de la longueur).Hey s'il vous Plaît utiliser ces lignes de codes , il aidera u..
Je sais que c'est une vieille question, mais je suis sûr que d'autres personnes trouveront aussi.
Si vous n'avez pas l'esprit un supplément de dépendance, voici une façon très simple
Vous aurez besoin d'un Jsoup de la bibliothèque, mais vous pouvez ajouter rapidement avec maven/gradle et il permet également de manipuler le contenu de la page et de trouver des noeuds.