2012-03-20 9 views
6

Me gustaría recuperar el contenido de una url. similares a las pitones:¿Por qué debería usar url.openStream en lugar de url.getContent?

html_content = urllib.urlopen("http://www.test.com/test.html").read() 

En los ejemplos (java2s.com) que se ven muy a menudo el siguiente código:

URL url = new URL("http://www.test.com/test.html"); 
String foo = (String) url.getContent(); 

la descripción de getContent es la siguiente:

Gets the contents of this URL. This method is a shorthand for: openConnection().getContent() 
Returns: the contents of this URL. 

En mi opinión eso debería funcionar perfectamente bien. peeero, obviamente, este código no funciona, ya que genera un error:

Exception in thread "main" java.lang.ClassCastException: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream cannot be cast to java.lang.String 

Obviamente devuelve un flujoEntrada.

Me pregunto: ¿cuál es el propósito de esta función que no está haciendo lo que parece hacer? ¿Y por qué no hay indicios de esto en la documentación? ¿Y por qué lo vi en varios ejemplos?

¿O estoy obteniendo esto mal?

La solución sugerida (stackoverflow) es usar url.openStream() y luego leer el flujo.

Respuesta

10

Como dijiste, la documentación dice que URL.getContent() es un atajo para openConnection().getContent() así que tenemos que mirar the documentation for URLConnection.getContent().

Podemos ver que esto devuelve un Object cuyo tipo está determinado por el campo de encabezado content-type de la respuesta. Este tipo determina el ContentHandler que se usará. Por lo tanto, ContentHandler convierte los datos basados ​​en su tipo MIME a la clase apropiada de objeto Java.

En otras palabras, el tipo de objeto que obtienes dependerá del contenido servido. Por ejemplo, no tendría sentido devolver un String si el tipo MIME era image/png.

Es por esto que en el código de ejemplo se vincula a por lo java2s.com comprueban la clase del objeto devuelto:

try { 
    URL u = new URL("http://www.java2s.com"); 
    Object o = u.getContent(); 
    System.out.println("I got a " + o.getClass().getName()); 
} catch (Exception ex) { 
    System.err.println(ex); 
} 

Así que se puede decir String foo = (String) url.getContent(); si sabe que su ContentHandler devolverá un String.

Existen manejadores de contenido predeterminados definidos en el paquete sun.net.www.content, pero como puede ver, están devolviendo las secuencias por usted.

Puede crear su propio ContentHandler que devuelva String, pero probablemente sea más fácil simplemente leer el flujo como sugiere.

3

Usted entiende mal lo que significa "Contenido". Esperaba que devolviera un String que contenga el HTML, pero devuelve un HttpInputStream. ¿Por qué? Porque la URL solicitada es una página web html. Otra URL válida podría ser http://www.google.com/logo.png. Esta URL no contiene contenido de cadena. Es una imagen

Cuestiones relacionadas