Java - 如何使用Scanner获取最后一行?

时间:2010-04-18 02:55:19

标签: java java.util.scanner

        while( inStream.hasNextLine() )
        {
                ...

                lineList.add( inStream.nextLine() );
        }
        ...

lineList是一个ArrayList。代码正在很好地读取所有内容,除非它不会抓住最后一行。文本文件中的最后两行如下所示:

"a sentence here..."
<a blank line here. the blank line is the last line>

我假设它不会抓住它,因为hasNextLine()在此之后没有检测到另一行?

什么方法可以抓住最后一行?我认为阅读直到它是EOF然后捕捉异常可能会有效但似乎没有办法做到这一点。

编辑:更多信息

public void readLines()
{
    lineList = new ArrayList();

    try
    {
        inStream = new Scanner( new File( fileName ) );
    }
    catch( FileNotFoundException e )
    {
        System.out.println( "Error opening the file. Try again." );
    }


    if ( inStream != null )
    {
        while( inStream.hasNextLine() )
        {
            ++originalLines;

            lineList.add( inStream.nextLine() );
        }
        inStream.close();
    }
}

有整个方法。怎么了?

编辑:更多信息

public static void main(String[] args)
{
    Scanner inStream = null;
    String test = "";

    inStream = new Scanner( test );

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

它不会拾取空字符串,但会拾取空格“”

5 个答案:

答案 0 :(得分:5)

nextLine()可以正常返回最后一行,即使它是空白的。我怀疑你的问题出在其他地方。

String multilinetext =
    "Line1\n" +
    "Line2\n" +
    "\n" +
    "Line4\n" +
    "\n";
Scanner sc = new Scanner(multilinetext);
while (sc.hasNextLine()) {
    System.out.println("[" + sc.nextLine() + "]");
}
/* prints 
[Line1]
[Line2]
[]
[Line4]
[]
*/

  

它不会拾取空字符串

这是设计的正确行为。如果输入为空字符串,则Scanner不能指出hasNextLine()并在nextLine()上返回空字符串,尤其是因为这不会使Scanner前进过去任何角色。

如果您考虑一下,如果您希望Scanner对空字符串说hasNextLine(),并在nextLine()上返回一个空字符串,那么这将导致无限循环:它总是 hasNextLine()并且总是nextLine() 永远上返回一个空字符串。这种行为显然是不切实际的。

答案 1 :(得分:1)

这段代码对我来说很好 - 你确定最后确实有一个空白行(例如,文件以两个换行符结尾,而不仅仅是一行)?

答案 2 :(得分:1)

扫描仪不会拾取空字符串。没有什么可以标记的。 Scanner是一个tokenizer,默认根据Java 6 javadoc使用Character.isWhitespace。每次遇到令牌之前,它都以字符串形式返回,但不包括令牌。如果最后一项是令牌,则会将其删除,并且不会添加任何新行。您可能最终在ArrayList中使用空字符串,但它只是一个空字符串,因为该标记已被删除。没有数据,没有令牌和扫描仪看不到线路。你在编辑器中看到的不是空白。如果键入,光标位于将添加字符的位置。如果你没有输入任何东西那里就没有实际的那条线。

答案 3 :(得分:0)

我想指出两者

String multilinetext =
    "Line1\n" +
    "Line2\n" +
    "\n" +
    "Line4\n";

String multilinetext =
    "Line1\n" +
    "Line2\n" +
    "\n" +
    "Line4";

使用@polygenelubricants代码返回完全相同的结果:

[Line1]
[Line2]
[]
[Line4]

因为Scanner没有给出最终的&#34;换行符&#34;字符。

所以如果你想得到最后一个空的&#34;这不是正确的解决方案,您应该读取每个字节。

答案 4 :(得分:0)

最后找到了一条路来!这是代码:

public static void main(String[] args) {
    String multiLineText = "Line1\n" +
        "Line2\n" +
        "\n" +
        "Line4\n" +
        "\n" +
        "";
    Scanner scanner = new Scanner(multiLineText).useDelimiter("\r?\n");
    String line = firstLine(scanner);
    System.out.println("[" + line + "]");
    while (hasNextLine(scanner)) {
        line = nextLine(scanner);
        System.out.println("[" + line + "]");
    }
    /* prints ALL six lines */
    // [Line1]
    // [Line2]
    // []
    // [Line4]
    // []
    // []
    scanner.close();
}

private static String firstLine(Scanner scanner) {
    // Check for empty first line.
    scanner.useDelimiter("");
    if (scanner.hasNext("\n")) {
        scanner.useDelimiter("\r?\n");
        return "";
    }

    // Check for empty input.
    scanner.useDelimiter("\r?\n");
    if (scanner.hasNext()) {
        return scanner.next();
    }

    return "";
}

private static boolean hasNextLine(Scanner scanner) {
    return scanner.hasNext() || scanner.hasNextLine();
}

private static String nextLine(Scanner scanner) {
    if (scanner.hasNext()) {
        return scanner.next();
    }
    return scanner.nextLine();
}

不客气。 (经过测试的JDK 1.8,JDK 11.0.2,JDK 12.0.2)

更新:2019-09-23 我发现即使获得第一线也是一个使命!我发布了更新后的代码,以便兑现“每一行”的要求。