Kurze Frage: aus einer File die Zeilenanzahl auslesen

pcProfie

Aktives Mitglied
moin community,
ich bin gerad an nem größerem projekt deshalb nur ne kurze frage:
ich habe ein file f
einen string array a
einen scanner sc

ich will die file einlesen und jede zeile in einen array platz tun

Java:
Scanner sc = new Scanner(f);
//zeugs...
String[] a = new String[hilfeHier];
int l = 0;
while (sc.hasNextLine()) {
                                //ich habs abgespeckt ich hoffe es geht so
				a[l] = sc.nextLine();
				l++;
			}
da wo hilfeHier steht soll ein befehl rein, der die zeilenanzahl aus der file ließt
damit ich später dann normal a.length benutzen kann
das ganze soll so einfach wie möglich gemacht werden... wie gesagt GROßES projekt
ich vermute mal das da .... String[sc. ...]; oder ... String[f. ...] reinkommt.
danke schonmal 😉
 
Wenn du unbedingt Array verwenden willlst, dürfte folgendes hilfreich sein:

Java:
public int hilfeDa()(String dateipfad) throws IOException {
LineNumberReader zeilenspecht= new LineNumberReader(new FileReader(dateipfad));
     int zeilen= 0;
     String lineRead = "";
          while ((lineRead = zeilenspecht.readLine()) != null) {}
     zeilen= zeilenspecht.getLineNumber(); 
     zeilenspecht.close();
     return zeilen;
}
 
ssoul26 hat gesagt.:
Wenn du unbedingt Array verwenden willlst, dürfte folgendes hilfreich sein:...
Leider nur teilweise. Denn für die Initalisierung des Arrays muss im Vorhinein die Anzahl der Zeilen bekannt sein. Deswegen ist xehpuk's Vorschlag mit der Liste besser.
 
Wenn ich das richtig verstanden habe, ist der Vorschlag, die Datei zweimal einzulesen.
  1. Anzahl der Zeilen bestimmen.
  2. Array mit der Anzahl erstellen und mit Zeilen befüllen.

Wenn es am Ende unbedingt ein Array sein muss, halte ich es für wesentlich sinnvoller, die Liste am Ende in ein Array zu kopieren:
Java:
final List<String> linesList = new ArrayList<>();
// Zeilen einlesen
final String[] linesArray = linesList.toArray(new String[linesList.size()]);
So spart man sich den doppelten I/O-Overhead.
 
Genau, der Vorschlag war zweimal einlesen, sollte man unbedingt nur mit Array arbeiten wollen. Das mit der Liste ist natürlich besser.
Java:
String pfad = "\\test.txt";
int zeilen= hilfeDa()(String pfad);
 
das ganze soll so einfach wie möglich gemacht werden... wie gesagt GROßES projekt
Heißt "großes Projekt" so viel wie: Verarbeitet zig Terrorbytes an Daten? Oder: Wird fetter als Windows Vista?

Wenn es am Ende unbedingt ein Array sein muss, halte ich es für wesentlich sinnvoller, die Liste am Ende in ein Array zu kopieren:
Java:
final List<String> linesList = new ArrayList<>();
// Zeilen einlesen
final String[] linesArray = linesList.toArray(new String[linesList.size()]);
So spart man sich den doppelten I/O-Overhead.
Ich behaupte mal, dass sich dank Caching-Mechanismen seitens des Betriebssystems dieser Overhead (und damit der Vorteil durch Umkopieren) sehr in Grenzen halten wird. (Du hast natürlich selbst angedeutet, dass das nur sinnvoll ist, wenn unbedingt ein Array rauskommen soll.) Wahrscheinlicher, so vermute ich, will der TO die Datei gar nicht komplett im Speicher halten, und wenn diese Vermutung stimmt, kann/sollte man an ganz anderen Stellen ansetzen.

Ark
 
Ohne mehrfachen Aufrufs des Filereaders.
Java:
StringBuilder temp = new StringBuilder("");
while ((lineRead = zeilenspecht.readLine()) != null) {
temp.append(lineRead+"||");
}
String [] zeilen = temp.toString().split("||");
 
Ohne mehrfachen Aufrufs des Filereaders.
Java:
StringBuilder temp = new StringBuilder("");
while ((lineRead = zeilenspecht.readLine()) != null) {
temp.append(lineRead+"||");
}
String [] zeilen = temp.toString().split("||");

Das ist ja weder halbwegs performant noch korrekt. Dann besser die Lösung von xehpuk nehmen, die ist nämlich nicht nur performanter, sondern funktioniert sogar.

Ark
 

Zurück
Oben