2013-02-28 61 views
3

我无法看到下面的代码有什么问题。没有时输出空值。为什么我的Java BufferedReader在文件开始和结束时读取空值?

输出:null This is one. This is two. This is three. This is four five six. seven? null

文件的内容:

This is one. 
This is two. 
This is three. 
This is four 
five 
six. 
seven? 

任何帮助将不胜感激!

try (BufferedReader br = new BufferedReader(new FileReader(filename))) { 

    String cLine=""; 
    while ((cLine = br.readLine()) != null) { 
     content+= cLine; 

    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

System.out.println(content); 
+0

显示如何初始化内容,可能设置为空 – 2013-02-28 20:19:48

+0

此外,更喜欢使用['StringBuilder'](http://docs.oracle.com/javase/ 6/docs/api/java/lang/StringBuilder.html)重复连接字符串。 – 2013-02-28 20:23:24

回答

7

我怀疑content为空,开始与(而不是空的),它解释了第一null。这并不能说明是最后一个,无可否认...我的猜测是,你实际上已经修正了一个错误,因为你看到在年底与null输出。如果不是这样,你的文件实际上null底。 (我已经用content进行了测试,初始化为“”,这很好。)

您是否知道您将删除所有换行符,而不是用任何分隔符替换它们?因此,一个包含“x”,“y”和“z”行的文件将变成“xyz”。

此外,考虑使用StringBuilder而不是字符串连接 - 它会更有效,因为它不需要始终复制字符串。

+0

只是想知道我自己的知识,如果BufferedReader检测到回车符,它会返回null吗?那么,可能第二个null是'seven'下的空行吗? – Chris 2013-02-28 20:33:24

+1

@ChristopherDay:Nope - 它会为空行返回一个空字符串。它*只*在流尾部返回'null'。 – 2013-02-28 20:35:29

+0

谢谢您花时间回答。我知道这是关于主要问题的话题。 – Chris 2013-02-28 20:38:06

-2

如果开始了与Java,我建议喜欢使用扫描仪上的文件,而不是简单的东西...。思考如下:

Scanner fileRead = new Scanner(fileName); 

while (fileRead.hasNextLine()) { 
    System.out.println(fileRead.nextLine()); 
} 

反正我的建议。

+2

这并没有真正回答这个问题... – 2013-02-28 20:22:48

+0

如果他是在新的Java更容易更简单的方法来启动,它只是一个建议。如果是关于他的学习,而不仅仅是获得答案,我会认为它很有用。 – ObedMarsh 2013-02-28 20:35:26

0

只是一个评论...

我不知道try的这种语法。起初,我认为这是一个错字,但我发现它确实有效(我编译并运行代码)。

我想它总是: 尝试{ .... .... .... }赶上(){}

上进一步阅读,发现这是一个新的功能“试用资源”(来自Special syntax of java try catch block

相关问题