2
        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() );
    }
}

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

4

5 回答 5

6

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]
[]
*/

它不会拾取空字符串

这是设计上的正确行为。如果输入是一个空字符串,你不能期望 aScannerhasNextLine()并返回一个空字符串 on nextLine(),特别是因为这不会Scanner超过任何字符。

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

于 2010-04-18T03:16:18.510 回答
1

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

于 2010-04-18T03:03:18.923 回答
1

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

于 2010-04-18T06:51:58.453 回答
1

我想指出,两者

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

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

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

[Line1]
[Line2]
[]
[Line4]

因为 Scanner 不会返回最终的“换行符”字符。

因此,如果您想获得最后一个“空”行,这不是正确的解决方案,您应该阅读每个字节。

于 2017-10-05T15:32:13.177 回答
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 我发现即使获得第一行也可以是一项任务!我发布了更新的代码,所以不辜负“每一行”的说法。

于 2019-09-22T15:37:19.183 回答