2015-01-04 227 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