2016-09-11 138 views
0

我正在嘗試使用下面的代碼讀取網頁內容。但它不按預期打印網頁內容。在IDE上看不到任何錯誤。並沒有例外。代理也沒有設置。任何人都可以指導爲什麼它可能不工作無法讀取網頁內容

import java.net.*; 
import java.io.*; 

public class URLReader { 
    public static void main(String[] args) throws Exception { 

     URL oracle = new URL("http://www.oracle.com/"); 
     BufferedReader in = new BufferedReader(
     new InputStreamReader(oracle.openStream())); 

     String inputLine; 
     while ((inputLine = in.readLine()) != null) 
      System.out.println(inputLine); 
     in.close(); 
    } 

該控件不會進入while循環調試。但是在緩衝區讀取器obj中,有一個可見的java對象

回答

1

URL http://www.oracle.com/不是HTTPS URL,因此在嘗試打印網站內容時不會看到任何輸出。嘗試使用此URL運行程序:https://www.oracle.com/

+0

可悲的例子是從Oracle本身,他們從來沒有考慮這一點。 – Maxs728

+0

默認情況下,在這種情況下,'HttpURLConnection'將遵循Oracle發佈到https:// www.oracle.com的重定向。 – EJP

+0

這是真的......我想這只是一個基於Oracle處理其重定向的方式不起作用的情況。 –

0

接受的答案(和註釋)實際上並不能解釋這裏發生了什麼以及程序爲什麼沒有。

首先,在您喜歡的網頁瀏覽器中打開網址http://www.oracle.com/。請注意,您是如何最終在網址欄中輸入網址https://www.oracle.com/index.html?發生了什麼事情是http://www.oracle.com/的Web服務器已將您的瀏覽器重定向到新的URL。

重定向工作由服務器向瀏覽器發出的GET請求發送某種重定向響應(狀態碼3xx)。瀏覽器讀取重定向響應,提取重定向的目標URL,然後將GET請求重新發送到目標URL。 (這可以重複....)

因此,您的示例中發生的是您的代碼不尊重重定向。相反,它只是將3xx響應視爲正常響應。然後您的代碼正在讀取響應的「正文」,該正文爲空。

當您手動將URL更改爲真正的目標(或等價物)時,您可以避免重定向的需要....您的代碼有效。如果你希望你的代碼能夠處理重定向,你需要以不同的方式寫它。

但是,在這種情況下不足以使用HttpUrlConnection只需打開「跟隨重定向」選項。 Java HTTP堆棧將不會遵循重定向到不同協議(例如HTTP到HTTPS);看到這種問答&答: