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