bufferedreader - 读入stringbuffer而不是string

时间:2013-02-01 00:04:50

标签: java stream while-loop bufferedreader stringbuffer

我有以下代码。我想要做的是将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而不退出循环。任何

3 个答案:

答案 0 :(得分:3)

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,否则请使用{{1}},这样会更快。

答案 1 :(得分:1)

这完美无缺。你只需要捕获NUllPointerException

while(line.append(reader.readLine().toString()) != null){ 

答案 2 :(得分:0)

您可以尝试使用此for循环:

for (String line; (line = reader.readLine()) != null;) {
    System.out.println(line); // Or whatever
}