Java Scanner.hasNextLine()没有检测到空行?

时间:2015-11-17 11:01:53

标签: java

假设我有以下文件

Hej Hej Hej
A A A A

在A&A之后的换行符。

我的问题是代码

while (in.hasNextLine()) {
    String line = in.nextLine();
    if (in.hasNextLine()) {
        out.println(line);
    }
    else {
        out.print(line);
    }
}

in.hasNextLine()中没有检测到这个额外的行,所以我错过了输出文件中的换行符(我正在做一个文件串联程序)。问题是什么?

2 个答案:

答案 0 :(得分:5)

当您正在阅读"下一行"时,您需要两次调用.hasNextLine()只有一次。

您的代码应该是:

while (in.hasNextLine()) {
    String line = in.nextLine();        
    out.println(line);            
}

或者,如果你想在循环中再次检查下一行,你应该这样做(我发现它不够干净,因为它与上面的代码片完全一样):

while (in.hasNextLine()) {
    String line = in.nextLine();
    if (in.hasNextLine()) {
        String nextLine = in.nextLine();
        out.println(line);
    } else {
        out.print(line);
    }
}

答案 1 :(得分:0)

Scanner.getLine()读取当前行上的所有字符,包括行终止符(如果有的话),然后丢弃行终止符。使用此方法,无法知道文件是否以行终止符结束。

如果您正在编写文件串联程序,为什么要逐行阅读?这样做可能会导致数据丢失;例如,您的输出文件将使用平台默认行终止符(例如“\ r \ n”或“\ n”),而不管您的输入文件使用哪个行终止符。

将文件作为字节流读取和写入更有意义,例如使用InputStream.read(byte[])。更好的是,使用Java 7中新引入的java.nio.file.Files.copy(Path source, OutputStream out)并为您完成所有艰苦工作。

但是,需要注意的一点是,如果要连接的文件是具有不同字符编码的文本文件,则需要将它们转换为在输出文件中使用相同的编码。在这种情况下,请使用FileReader和Writer。