1

我有以下代码。我想做的是将 BufferedReader 中的每一行直接读入 StringBuffer 以减少内存开销。一旦它到达数据流的末尾,我希望它退出 while 循环。

StringBuffer line = new StringBuffer();
        URL url = new URL("a url");
        BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
                int count = 0;
                while(line.append(reader.readLine()) != null){
                    System.out.println(line.toString());
                    line.delete(0,line.length());
                }

它可以很好地读取流,但是当我到达流的末尾时,它会返回 null 并在不退出循环的情况下继续打印 null。任何

4

3 回答 3

4

这与说永远不可能发生的情况while(line.append(reader.readLine()) != null)基本相同。while(line.append(reader.readLine()).toString() != null)

您可能遇到的另一个问题null实际上是被翻译String"null". 这就是它打印“null”的原因,该值实际上并没有null- 混淆......

相反,尝试类似...

String text = null;
while((text = reader.readLine()) != null){
    line.append(text)
    System.out.println(line.toString());
    line.delete(0,line.length());
}

更新

当我在这里时,我可能会建议您实际上并没有为自己节省任何东西。

readLine将创建String对象,您将其放入StringBuffer. 您实际上并没有节省任何内存,而是使过程复杂化。

如果您真的担心String在内存中创建大量对象,请BufferedReader#read(char[])改用。将生成的字符数组附加到StringBuffer.

此外,除非您需要同步访问 , 否则StringBuffer使用StringBuilder它会更快。

于 2013-02-01T00:12:39.820 回答
1

这完美地工作。你只需要抓住 NUllPointerException

while(line.append(reader.readLine().toString()) != null){ 
于 2013-02-01T00:31:56.623 回答
0

你可以用这个 for 循环尝试同样的方法:

for (String line; (line = reader.readLine()) != null;) {
    System.out.println(line); // Or whatever
}
于 2013-02-01T00:13:03.250 回答