2012-03-20 13 views
6

Chciałbym odzyskać zawartość adresu URL. podobne do pytonów:Dlaczego powinienem używać adresu url.openStream zamiast adresu url.getContent?

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

W przykładach (java2s.com) widać bardzo często następujący kod:

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

opisie getContent jest następujący:

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

Moim zdaniem to powinno działać idealnie dobrze. Buuut oczywiście ten kod robi praca, ponieważ podnosi błąd:

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

Oczywiście zwraca InputStream.

Więc pytam siebie: jaki jest cel tej funkcji, która nie robi tego, co wydaje się robić? A dlaczego nie ma w tym żadnej wskazówki na temat dziwactwa? I dlaczego zobaczyłem to na kilku przykładach?

Czy to źle?

Zalecanym rozwiązaniem (stackoverflow) jest użycie url.openStream(), a następnie odczytanie strumienia.

Odpowiedz

10

Jak już powiedziałeś, dokumentacja mówi, że URL.getContent() jest skrótem dla openConnection().getContent(), więc musimy spojrzeć na the documentation for URLConnection.getContent().

Widzimy, że to zwraca wartość Object, której typ jest określony przez pole nagłówka odpowiedzi content-type. Ten typ określa wartość parametru ContentHandler, która będzie używana. Tak więc ContentHandler konwertuje dane na podstawie swojego typu MIME do odpowiedniej klasy obiektu Java.

Innymi słowy rodzaj obiektu, który otrzymasz, zależy od dostarczonej treści. Na przykład nie ma sensu zwracanie wartości String, jeśli typ MIME to image/png.

Dlatego w przykładowym kodzie połączyć co java2s.com sprawdzić ich klasę zwróconego obiektu:

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

Więc można powiedzieć String foo = (String) url.getContent(); Jeśli znasz ContentHandler zwróci String.

Istnieją domyślne procedury obsługi treści zdefiniowane w pakiecie sun.net.www.content, ale jak widać, zwracają strumienie dla Ciebie.

Można utworzyć własny ContentHandler, który zwraca wartość String, ale prawdopodobnie będzie łatwiej po prostu odczytać strumień, jak sugerujesz.

3

Nie rozumiesz, co oznacza "Treść". Oczekiwano, że zwróci ciąg zawierający kod HTML, ale zwróci wartość HttpInputStream. Czemu? Ponieważ żądany adres URL to strona internetowa HTML. Innym prawidłowym adresem URL może być http://www.google.com/logo.png. Ten adres URL nie zawiera treści String. To jest obraz.

Powiązane problemy