Textdatei- Zeilenermittlung

Hi,

ich habe eine Textdatei, welche ich zeilenweise in einen Vector einlesen will.
Ideal wäre es, wenn ich vorher wüßte, wieviele Zeilen die Datei hat, damit ich den Vector gleich richtig dimensionieren kann.

Hat einer eine Idee, ob und wie das geht?

Besten Dank

Winni

Auch hallo,

ich glaube mal Du brauchst den sog. „StreamFileReader“ sowie Kenntnisse über die Stackprogrammierung (oder ‚hasMoreelements‘ ?) um dieses Problem bewältigen zu können.

Glauben heisst aber nicht wissen :wink:
mfg M.L.

Hallo,

ich glaube mal Du brauchst den sog. „StreamFileReader“ sowie

Nunja, da wird er sich schwer tun, weil eine Klasse mit dem Namen „StreamFileReader“ nicht existiert *g*

Aber „BufferedReader.readLine()“ wird ihm wohl eher weiterhelfen :wink:

Kenntnisse über die Stackprogrammierung (oder
‚hasMoreelements‘ ?) um dieses Problem bewältigen zu können.

Das braucht er dann auch nicht :wink:

Glauben heisst aber nicht wissen :wink:

Eben :wink:

mfg
deconstruct

Hallo,

Ideal wäre es, wenn ich vorher wüßte, wieviele Zeilen die
Datei hat, damit ich den Vector gleich richtig dimensionieren
kann.

Wieso willst du das machen? Java allokiert für einen Vector automatisch Speicher, und zwar afaik soviel, dass 10 Objekte reinpassen. Eine Initialkapazität beim Vektor verhindert nur, dass das Vektor-Objekt nicht allzu stark fragmentiert im Speicher abgelegt wird. Eine solche Fragmentierung macht sich aber bei kleinen Vektoren nicht bemerkbar. Das ganze würde also nur was bringen, wenn du Dateien von einigen 100.000 Zeilen oder so hast.

Hat einer eine Idee, ob und wie das geht?

Ja, lies die Datei mit BufferedReader.readLine() ein, und zähl wie oft du das machen kannst. Das ist zwar eigentlich dumm, aber anders gehts nicht, weil in einer Datei keine Information abgespeichert wird, wieviele Zeilen in ihr enthalten sind.
Das führt aber auch dazu, dass du die Datei zweimal einlesen musst, einmal für die Ermittlung der Zeilenanzahl und das zweite Mal für das eigentliche Einlesen der Zeilen. Das macht die Sache noch unbrauchbarer, in Hinblick auf die Performance.

Was ich dir daher eher vorschlagen würde, ist, dass du dem Vektor eine ausreichend große Intial-Kapazität gibst (vlt. 100 oder 1000, hängt halt davon ab, wie groß die Dateien sind, die du damit einlesen willst). Desweiteren legst du noch fest, um wieviel der Vektor wachsen soll, wenn er voll ist. Diese Zahl legst du auf dieselbe Größe, wie die Initialkapzität. Dadurch verhindest du, dass der Vektor zu stark fragmentiert wird, weil immer ein relativ großer Bereich zusammenhängend im Speicher liegt.
Dazu nimmst du für den Vektor einfach den Konstruktor public Vector(int initialCapacity, int capacityIncrement) her, siehe
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Ve…

Da gibts auch noch ein paar Tuningmaßnahmen, die das mit der Kapazität noch besser machen, aber das braucht man wohl nur für Spezialfälle.

mfg
deconstruct