pagina - Lee la url de la cadena en algunas líneas del código java
obtener datos de una pagina web con java (8)
Estoy tratando de encontrar el equivalente de Java a Groovy:
String content = "http://www.google.com".toURL().getText();
Quiero leer el contenido de una URL en una cadena. No quiero contaminar mi código con flujos almacenados en búfer y bucles para una tarea tan simple. Miré HttpClient de Apache pero tampoco veo una implementación de una o dos líneas.
Ahora que ha pasado más tiempo, he aquí una forma de hacerlo en Java 8:
URLConnection conn = url.openConnection();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
pageText = reader.lines().collect(Collectors.joining("/n"));
}
Ahora que ha pasado un tiempo desde que se aceptó la respuesta original, hay un mejor enfoque:
String out = new Scanner(new URL("http://www.google.com").openStream(), "UTF-8").useDelimiter("//A").next();
Si desea una implementación un poco más completa, que no es una sola línea, haga esto:
public static String readStringFromURL(String requestURL) throws IOException
{
try (Scanner scanner = new Scanner(new URL(requestURL).openStream(),
StandardCharsets.UTF_8.toString()))
{
scanner.useDelimiter("//A");
return scanner.hasNext() ? scanner.next() : "";
}
}
Ejemplo adicional usando Guava:
URL xmlData = ...
String data = Resources.toString(xmlData, Charsets.UTF_8);
Esta respuesta se refiere a una versión anterior de Java. Es posible que desee ver la respuesta de Ccleve.
Esta es la forma tradicional de hacer esto:
import java.net.*;
import java.io.*;
public class URLConnectionReader {
public static String getText(String url) throws Exception {
URL website = new URL(url);
URLConnection connection = website.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
connection.getInputStream()));
StringBuilder response = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null)
response.append(inputLine);
in.close();
return response.toString();
}
public static void main(String[] args) throws Exception {
String content = URLConnectionReader.getText(args[0]);
System.out.println(content);
}
}
Como @extraneon ha sugerido, ioutils te permite hacer esto de una manera muy elocuente que todavía está en el espíritu de Java:
InputStream in = new URL( "http://jakarta.apache.org" ).openStream();
try {
System.out.println( IOUtils.toString( in ) );
} finally {
IOUtils.closeQuietly(in);
}
Hay una forma aún mejor a partir de Java 9:
URL u = new URL("http://www.example.com/");
try (InputStream in = u.openStream()) {
return new String(in.readAllBytes(), StandardCharsets.UTF_8);
}
Al igual que el ejemplo groovy original, esto supone que el contenido está codificado en UTF-8. (Si necesita algo más inteligente que eso, necesita crear una URLConnection y usarla para descubrir la codificación).
Lo siguiente funciona con Java 7/8, URL seguras y muestra cómo agregar una cookie a su solicitud también. Tenga en cuenta que esto es principalmente una copia directa de esta otra gran respuesta en esta página , pero agregó el ejemplo de cookie y aclaración, ya que también funciona con URL seguras ;-)
Si necesita conectarse a un servidor con un certificado no válido o un certificado autofirmado, arrojará errores de seguridad a menos que importe el certificado. Si necesita esta funcionalidad, puede considerar el enfoque detallado en esta respuesta a esta pregunta relacionada en .
Ejemplo
String result = getUrlAsString("https://www.google.com");
System.out.println(result);
salidas
<!doctype html><html itemscope="" .... etc
Código
import java.net.URL;
import java.net.URLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public static String getUrlAsString(String url)
{
try
{
URL urlObj = new URL(url);
URLConnection con = urlObj.openConnection();
con.setDoOutput(true); // we want the response
con.setRequestProperty("Cookie", "myCookie=test123");
con.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder response = new StringBuilder();
String inputLine;
String newLine = System.getProperty("line.separator");
while ((inputLine = in.readLine()) != null)
{
response.append(inputLine + newLine);
}
in.close();
return response.toString();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
O simplemente use IOUtils.toString(URL url)
o la variante que también acepta un parámetro de codificación.
Si tiene la corriente de entrada (vea la respuesta de Joe) también considere ioutils.toString (inputstream).
http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#toString(java.io.InputStream )