URL de leitura para string em poucas linhas de código java

Estou tentando encontrar o equivalente do Java ao Groovy:

String content = "http://www.google.com".toURL().getText(); 

Eu quero ler o conteúdo de uma URL em string. Eu não quero poluir meu código com streams e loops em buffer para uma tarefa tão simples. Eu examinei o HttpClient do apache, mas também não vejo uma implementação de uma ou duas linhas.

Agora que já passou algum tempo desde que a resposta original foi aceita, há uma abordagem melhor:

 String out = new Scanner(new URL("http://www.google.com").openStream(), "UTF-8").useDelimiter("\\A").next(); 

Se você quiser uma implementação um pouco mais completa, que não seja uma única linha, faça o seguinte:

 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() : ""; } } 

Esta resposta se refere a uma versão mais antiga do Java. Você pode querer ver a resposta de ccleve.


Aqui está a maneira tradicional de fazer isso:

 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 o @extraneon sugeriu, o ioutils permite que você faça isso de uma maneira muito eloquent que ainda está no espírito do Java:

  InputStream in = new URL( "http://jakarta.apache.org" ).openStream(); try { System.out.println( IOUtils.toString( in ) ); } finally { IOUtils.closeQuietly(in); } 

Ou apenas use IOUtils.toString(URL url) ou a variante que também aceita um parâmetro de codificação.

Agora que mais tempo passou, aqui está uma maneira de fazer isso no 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")); } 

Exemplo adicional usando Goiaba:

 URL xmlData = ... String data = Resources.toString(xmlData, Charsets.UTF_8); 

Há uma maneira ainda melhor a partir do Java 9:

 URL u = new URL("http://www.example.com/"); try (InputStream in = u.openStream()) { return new String(in.readAllBytes(), StandardCharsets.UTF_8); } 

Como o exemplo groovy original, isso pressupõe que o conteúdo é codificado em UTF-8. (Se você precisar de algo mais inteligente do que isso, você precisa criar um URLConnection e usá-lo para descobrir a codificação.)

Se você tiver o stream de input (veja a resposta de Joe), também considere ioutils.toString (inputstream).

http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#toString(java.io.InputStream )

O seguinte trabalha com o Java 7/8, urls seguros e mostra como adicionar um cookie à sua solicitação também. Note que esta é principalmente uma cópia direta desta outra grande resposta nesta página , mas acrescentou o exemplo do cookie, e esclarecimento de que ela funciona com URLs seguros também 😉

Se você precisar se conectar a um servidor com um certificado inválido ou certificado autoassinado, isso gerará erros de segurança, a menos que você importe o certificado. Se você precisar dessa funcionalidade, considere a abordagem detalhada nesta resposta a essa pergunta relacionada no StackOverflow.

Exemplo

 String result = getUrlAsString("https://www.google.com"); System.out.println(result); 

saídas

 < !doctype html> 

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); } }