簡體   English   中英

關閉BufferedReader和InputStreamReader

[英]Closing BufferedReader and InputStreamReader

這段代碼正在創建BufferedReaderInputStreamReader導致的內存泄漏問題,我認為可能會發生一些異常。 我該怎么改變它?

try{
    URL url = new URL(sMyUrl);
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
    while ((str = in.readLine()) != null) {
        jsonString += str;
    }
    in.close();
}catch(Exception e){

}

使用try..finally塊關閉流更安全。 您也可以使用StringBuilder因為它是為連接字符串而設計的。 您還應該避免捕獲Exception並對其執行任何操作。 此外,您的代碼是連接行沒有任何換行符。 這可能不是你想要的,在這種情況下,當你讀取每一行時append("\\n")

這是一個包含這些修改的版本:

StringBuilder json = new StringBuilder();
try {
    URL url = new URL(sMyUrl);
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
    try {
        String str;
        while ((str = in.readLine()) != null) {
            json.append(str).append("\n");
        }
    } finally {
        in.close();
    }
} catch (Exception e) {
    throw new RuntimeException("Failed to read JSON from stream", e);
}

代碼不漂亮,但不會造成內存泄漏。 我建議你使用內存分析器來確定你的內存使用位置。 否則你只是猜測即使你有10年以上的Java經驗性能調優;)

更好的選擇是使用Java 7

URL url = new URL(sMyUrl);
try(BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
  while ((str = in.readLine()) != null) {
     jsonString.append(str).append("\n");
  }
}

如果您使用Java 6或更早版本,則可以使用。

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
try {
  while ((str = in.readLine()) != null) {
     jsonString.append(str).append("\n");
  }
} finally {
  in.close();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM