2015-01-04 187 views
0

我有一個場合,我需要從給定的URL返回一個閱讀器。在這種情況下,url始終有一個像http或https這樣的協議。我毫無困難地爲此創建代碼。連接閱讀器

我想知道更好的做法是,前一種方法還是後一種?

public Reader getContents (final URL url) { 
    try { 
     final Reader stream = new InputStreamReader(url.openConnection().getInputStream()); 
     final StringBuilder builder = new StringBuilder(); 

     int character; 
     while ((character = stream.read()) != -1) 
      builder.append((char)character); 
     stream.close(); 
     return new StringReader(builder.toString()); 
    } catch (final IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

該方法首先從URL內容創建一個String,然後返回該String的讀者。在下面的代碼中,我只是返回InputStreamReader。我擔心的一個問題是輸入流沒有被閱讀器關​​閉,因爲可能不會調用Reader.close()方法。我想知道更糟糕的是,不關閉連接輸入流或關閉字符串輸入流。

這裏是第二種方法,這是直截了當:

public Reader getContents (final URL url) { 
    try { 
     return new InputStreamReader(url.openStream()); 
    } catch (final IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

這是有道理的做前者,但是這有什麼區別呢?

編輯 我所做的方法,就像接受的答案:

public static Reader getContents (final URL url) { 
    try { 
     final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.connect(); 

     String charset = connection.getHeaderField("Content-Type"); 
     if (charset == null) 
      charset = "UTF-8"; 
     else 
      charset = charset.replaceAll(".*charset=(.*)", "$1"); 

     return new InputStreamReader(connection.getInputStream(), charset); 
    } catch (final IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

回答

0

如果您打算公開數據爲Reader(這是比較困難的不僅僅是一個String消耗),那麼第二種方法獲得了使用Reader的好處 - 即限制消耗的內存量。

您還應指定要使用的字符編碼。您應該檢查http響應內容類型以查看是否指定了charset。如果不存在,http默認值爲iso-8859-1,所以應該使用,除非您正在調用的特定服務指定了不同的東西。您目前的方法使用平臺的默認字符編碼,這可能無法保證是正確的。

+0

感謝您的回覆。我做了一個新的方法,可以在前一篇文章中看到:) – engineercoding 2015-01-04 15:24:23