Actuellement, je travaille sur un cours qui peut être utilisé pour lire le contenu du site Web spécifié par l’URL. Je commence juste mes aventures avec Java.io
et Java.net
donc je dois consulter ma conception.
Usage:
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 la suivante: Est-ce un bon moyen de réaliser ce que je veux? Y a-t-il de meilleures solutions?
Je n’aimais pas particulièrement sb.append(new String(dataBuffer, ZERO, bytesRead));
mais je n’étais pas capable de l’exprimer différemment. Est-il bon de créer une nouvelle chaîne à chaque itération? Je suppose que non.
D'autres points faibles?
Merci d'avance!
Pensez à utiliser URLConnection
à la place. De plus, vous voudrez peut-être utiliser IOUtils
from Apache Commons IO pour faciliter également la lecture de la chaîne. Par exemple:
URL url = new URL("http://www.example.com/");
URLConnection con = url.openConnection();
InputStream in = con.getInputStream();
String encoding = con.getContentEncoding(); // ** WRONG: should use "con.getContentType()" instead but it returns something like "text/html; charset=UTF-8" so this value must be parsed to extract the actual encoding
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
System.out.println(body);
Si vous ne voulez pas utiliser IOUtils
, je réécrirais probablement cette ligne au-dessus de quelque chose comme:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[8192];
int len = 0;
while ((len = in.read(buf)) != -1) {
baos.write(buf, 0, len);
}
String body = new String(baos.toByteArray(), encoding);
Je recommande fortement d'utiliser une bibliothèque dédiée, comme HtmlParser :
Parser parser = new Parser (url);
NodeList list = parser.parse (null);
System.out.println (list.toHtml ());
Écrire votre propre analyseur HTML est une perte de temps. Voici sa dépendance maven . Regardez sa JavaDoc pour approfondir ses fonctionnalités.
L'examen de l'exemple suivant devrait être convaincant:
Parser parser = new Parser(url);
NodeList movies = parser.extractAllNodesThatMatch(
new AndFilter(new TagNameFilter("div"),
new HasAttributeFilter("class", "movie")));
Vous pouvez envelopper votre InputStream
dans une InputStreamReader
et utiliser c'est read()
, méthode pour lire directement les données de caractères (notez que devrait spécifier le codage lors de la création de Reader
, mais en recherchant le codage d'URL arbitraires est non-trivial). Ensuite, appelez simplement sb.append()
avec le char[]
que vous venez de lire (ainsi que le décalage et la longueur corrects).
À moins qu'il s'agisse d'une sorte d'exercice que vous souhaitez coder pour apprendre ... Je ne réinventerais pas la roue et j'utiliserais HttpURLConnection .
HttpURLConnection
fournit de bons mécanismes d'encapsulation pour traiter le protocole HTTP. Par exemple, votre code ne fonctionne pas avec les redirections HTTP. HttpURLConnection
pourrait résoudre ce problème pour vous.
Hey S'il vous plaît utiliser ces lignes de codes, cela vous aidera ..
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
URL uri= new URL("Your url");
URLConnection ec = uri.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
ec.getInputStream(), "UTF-8"));
String inputLine;
StringBuilder a = new StringBuilder();
while ((inputLine = in.readLine()) != null)
a.append(inputLine);
in.close();
out.println(a.toString());
Je sais que c'est une vieille question, mais je suis sûr que d'autres le trouveront aussi.
Si une dépendance supplémentaire ne vous dérange pas, voici un moyen très simple
Jsoup.connect("http://example.com/").get().toString()
Vous aurez besoin d'une bibliothèque Jsoup , mais vous pouvez l'ajouter rapidement avec maven/gradle. Cela permet également de manipuler le contenu de la page et de trouver des nœuds spécifiques.