2016-12-28 4 views
1

Ich bin ein Neuling in Java. Ich möchte die Anzahl der Zeilen in einer Testdatei finden, damit ich sie für die Array-Größe verwenden kann. Was war mein erster Gedanke, eine Schleife zu erstellen und eine int-Variable zu aktualisieren. wie folgt:Wie bekomme ich die Anzahl der Zeilen aus einer Textdatei in Java?

Scanner file = new Scanner(new File("data.text")); 
int n = 0; 
while(file.hasNextLine()) { 
    file.nextLine(); 
    n++; 
} 
int[] array = new int[n]; 

dies funktioniert nicht für mich, weil die Scanner-Datei am Ende der Textdatei ist. Ich kann die Textdatei nur lesen, wenn ich die ursprüngliche Datei schließe und ein neues Scannerobjekt erstelle. Gibt es eine bessere Möglichkeit, dies auszuführen?

+1

Verwenden Sie anstelle eines Arrays eine ['List '] (https://docs.oracle.com/javase/8/docs/api/java/util/List.html). Oder starten Sie mit einer festen Array-Größe und "skalieren" Sie das Array bei Bedarf (erstellen Sie ein Array doppelter Größe, kopieren Sie den alten Inhalt in das neue Array). Das sind die Ideen, die mir in den Sinn kommen. Es ist unmöglich, einen "Scanner" zurückzuspulen. – Turing85

+1

Sie möchten die Datei nicht zweimal lesen, verwenden Sie also kein Array, und Sie möchten mit hoher Wahrscheinlichkeit gar nicht erst eine ganze Datei in den Speicher einlesen. Praktisch jede Textdatei kann Zeile für Zeile oder Zeichen für Zeichen bearbeitet werden. – EJP

+0

Mögliches Duplikat von [Anzahl der Zeilen in einer Datei in Java] (http://stackoverflow.com/questions/453018/number-of-lines-in-a-file-in-java) –

Antwort

0

können Sie verwenden BufferedReader und FileReader:

FileReader in = new FileReader("data.txt"); 
BufferedReader br = new BufferedReader(in);// use this only if you have large files, meaning that each line is very long. 
int n = 0; 
while (br.readLine() != null) { 
    n++; 

} 
System.out.println(n); 
in.close(); 
int[] array = new int[n]; 

Sie können aber auch eine ArrayList anstelle eines Arrays verwenden, aber das würde davon abhängen, wie Sie die Zeilenzahl verwendet werden soll.

Wenn Ihre Datei nicht sehr groß ist, können Sie einfach tun:

FileReader in = new FileReader("data.txt"); 
int n = 0; 
while ((in.readLine() != null)) { 
    n++; 

} 
System.out.println(n); 
in.close(); 
int[] array = new int[n]; 
+0

Ihr Vorschlag für 'BufferedReader' Ich frage mich, ob Sie verstehen, OPs Absicht, die ganze Datei zu lesen, nur um die Anzahl der Zeilen zu erhalten. – Tom

+0

@Tom Ich habe nicht darüber nachgedacht. Aber wenn die Datei ** sehr ** lange Zeilen hat, dann brauchen Sie einen 'BufferedReader'. Trotzdem habe ich meine Antwort entsprechend aktualisiert. – ItamarG3

+0

Es spielt keine Rolle, ob Sie 'BufferedReader',' FileReader' oder 'Scanner' verwenden, die ganze Idee, die komplette Datei zu lesen, um die Zeilenanzahl für ein Array zu erhalten und die Datei später wieder zu lesen, ist Unsinn. Deshalb hat OP nach einem besseren Weg gefragt und Sammlungen sind eins. – Tom

2

Wenn Sie 1.7+ verwenden, können Sie speichern direkt auf Array wie folgt.

import java.io.File; 

import java.nio.charset.Charset; 
import java.nio.file.Files; 
import java.nio.file.Path; 

import java.util.List; 

// more code 

Path filePath = new File("fileName").toPath(); 
Charset charset = Charset.defaultCharset();   
List<String> stringList = Files.readAllLines(filePath, charset); 
String[] stringArray = stringList.toArray(new String[]{}); 
0

Je nachdem, was genau Sie tun müssen, sollten Sie die gesamte Datei im Speicher behalten.

List<String> lines = Files.readAllLines(Paths.get("data.text")); 
// Here you can easily obtain the list size 
lines.size() 

Wenn Sie nicht die tatsächlichen Linien brauchen oder nicht alle von ihnen, können Sie so etwas wie dieses

long lineCount = Files.lines(Paths.get("data.text")).count(); 

tun, da es sich um eine Java-8-Stream ist, können Sie filtern, analysieren oder zu tun was auch immer Du willst mit den Linien.

0

Okay. Hier ist die einfache Antwort auf Ihre Frage. Sie möchten das gleiche Scanner-Objekt verwenden, um die Datei von Anfang an erneut zu lesen, ohne sie zu schließen.
Es ist unmöglich, dies zu tun..


Grund: Die verschiedenen Arten von Eingabetypen, die es unterstützt.Diese speichern die Ergebnisse nicht, nachdem sie weitergegeben wurden, so dass sie das Zurücksetzen nicht unterstützen.
Die elegante Lösung besteht also darin, ein neues Scannerobjekt zu erstellen.

Verwandte Themen