Java - Wie bekomme ich die Letzte Zeile mit Scanner?
while( inStream.hasNextLine() )
{
...
lineList.add( inStream.nextLine() );
}
...
lineList ist eine ArrayList. Der code liest sich alles schön, außer es wird nicht schnappen Sie sich die Letzte Zeile. Die letzten beiden Zeilen in der text-Datei so enden:
"a sentence here..."
<a blank line here. the blank line is the last line>
Ich nehme an, es wird nicht greifen, da hasNextLine() ist nicht zu erkennen, eine weitere Linie nach diesem?
Was ist ein Weg zu packen, die Letzte Zeile? Ich dachte, Lesen bis EOF und dann abfangen der Ausnahme, die funktionieren könnte, aber es scheint nicht zu einem Weg, dies zu tun.
EDIT: MEHR INFO
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();
}
}
Da ist die ganze Methode. Etwas falsch?
EDIT: NOCH MEHR INFO
public static void main(String[] args)
{
Scanner inStream = null;
String test = "";
inStream = new Scanner( test );
while( inStream.hasNextLine() )
{
System.out.println( inStream.nextLine() );
}
}
Es nicht abholen, wird eine leere Zeichenkette, aber es holt ein Leerzeichen " "
Du musst angemeldet sein, um einen Kommentar abzugeben.
nextLine()
Prima funktioniert, die Rückkehr der letzten Zeile, auch wenn es leer ist. Ich vermute, dein problem liegt woanders.Dies ist das korrekte Verhalten ist by design. Wenn die Eingabe ein leerer string, Sie können nicht erwarten, dass
Scanner
zu sagenhasNextLine()
und eine leere Zeichenfolge zurück aufnextLine()
, vor allem, da dies nicht Voraus, dasScanner
Vergangenheit jeder Figur.Wenn Sie über Sie denken, wenn Sie erwarten, einen
Scanner
zu sagenhasNextLine()
auf eine leere Zeichenfolge ist, und eine leere Zeichenfolge zurück aufnextLine()
wäre, dann wäre das Ergebnis in eine Endlosschleife: es wird immerhasNextLine()
und es wird immer eine leere Zeichenfolge zurück aufnextLine()
immer. Ein solches Verhalten ist eindeutig unpraktisch.wc -l
oder einem hex-editor usw. zu sehen, was die Datei wirklich enthält. Die "wenn ich die Pfeiltaste rechts drücken, es wollte sich nicht bewegen" - test ist nutzlos, weil, die abhängig von der text-editor das Verhalten und nicht das, was die eigentliche Datei enthält.String emptyString = "";
Dann tun, was Sie wollen mitemptyString
. Ich glaube nicht, dass Sie viel tun können, allerdings; ein leerer string ist wirklich nicht so interessant.Dass code, der funktioniert gut für mich-sind Sie sicher, dass es tatsächlich eine leere Zeile am Ende (wie in der Datei endet in zwei Zeilenumbrüche, nicht nur einer)?
Scanner nicht abholen eine leere Zeichenfolge. Es gibt nichts, was für die tokenisierung. Scanner ist ein tokenizer, ausgefallen, um Zeichen.isWhitespace nach Java 6 javadoc. Jedes mal, wenn das token gefunden wird alles, bevor es zurückgegeben wird, wie ein string, aber nicht einschließlich des token. Wenn das Letzte Element ist das Zeichen, es wird entfernt und es wird keine neue Zeile Hinzugefügt. Sie könnten am Ende mit leeren strings im ArrayList, aber es ist nur ein leerer string, weil der token entfernt wurde. Keine Daten und keine token und scanner nicht sehen, eine Linie. Was Sie sehen, in Ihrem editor ist nicht eine leere Zeile. Der cursor ist an der Stelle ein Zeichen Hinzugefügt werden, wenn Sie eingeben. Wenn Sie keine Eingabe machen, gibt es nicht eine tatsächliche Linie.
Möchte ich darauf hinweisen, dass beide
und
gibt wieder genau das gleiche Ergebnis mit @polygenelubricants code:
weil Scanner nicht zurück geben abschließenden "newline" - Zeichen.
Also, wenn Sie wollen bekommen noch eine Letzte "leere" Zeile dies ist nicht die richtige Lösung, und Sie sollten Lesen jedes byte.