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

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

lineList は ArrayList です。コードは、最後の行を取得しないことを除いて、すべてをうまく読み取っています。テキスト ファイルの最後の 2 行は、次のように終了します。

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

空の文字列は取得されません

これは、設計による正しい動作です。入力が空の文字列の場合、特にこれは過去の文字を進めないため、 a が で空の文字列Scannerを言っhasNextLine()て返すことは期待できません。nextLine()Scanner

考えてみると、 aが空の文字列Scannerに対して言うことを期待hasNextLine()し、 で空の文字列を返すと、これnextLine()無限ループなります 。そのような行動は明らかに非現実的です。hasNextLine()nextLine()

于 2010-04-18T03:16:18.510 に答える
1

そのコードは私にとってはうまく機能します-実際に最後に空白行があると思いますか(ファイルは1つだけでなく2つの改行で終了します)?

于 2010-04-18T03:03:18.923 に答える
1

Scanner は空の文字列を取得しません。トークン化するものは何もありません。Scanner はトークナイザーであり、Java 6 javadoc に従って Character.isWhitespace を使用するようにデフォルト設定されています。トークンが文字列として返される前のすべてが検出されるたびに、トークンは含まれません。最後の項目がトークンの場合、それは削除され、新しい行は追加されません。ArrayList に空の文字列が含まれる場合がありますが、トークンが削除されているため、空の文字列にすぎません。データもトークンもスキャナも行を認識しません。エディターに表示されているのは空白行ではありません。入力すると文字が追加される位置にカーソルがあります。何も入力しない場合、実際の行はありません。

于 2010-04-18T06:51:58.453 に答える