Bestimmte Zeile aus Datei lesen

helavi

Grünschnabel
Hallo,
ich möchte gerne eine Methode schreiben, mit der ich gezielt eine bestimmte Zeile aus einer Datei lesen kann. Mein folgender Versuch liefert leider nicht das gewünschte Ergebnis.

try {

File file = new File (filename);
FileReader eingabestrom = new FileReader(filename);
LineNumberReader lnr = new LineNumberReader(eingabestrom);
lnr.setLineNumber(zeilennr);
zeile = lnr.readLine();
eingabestrom.close();
}

Inzwischen habe ich gefunden woran das liegt, mit setLineNumber wird NICHT die Position im Stream verändert (wozu dient diese Methode dann überhaupt?), aber es muss doch irgendwie möglich sein z.B. die 234. Zeile aus einer Datei zu lesen, ohne mit einer for Schleife die davorliegenden 233 ebenfalls zu lesen, oder?
Vielen Dank schonmal für eure Lösungsvorschläge
Bettina
 
Hallo!

Sofern sich die Daten der Datei nicht ändern kannst du mal folgendes Versuchen:

Mein testfile:

Code:
0 fdskjhfdkjahkjhfkjahkjfhksda
1 fhdkjhfdkash kjhkjhfadskjfhfkjd
2 jflksdajlkjlkajlkjfdslkajlfk
3 fjsjflka
4 fjlkasjdlkdasf
5 dfjlkfsjalkdf
6 fjlkfjlkds
7 fdjlkjfds
8 fhkjdshkjashdkjhdfkjahfdskjd
9 fdshkjfdashfskjdfdshfskjashfdlkfdshfsdkjfdas
10 fdhkjfdhkjafshkjdhfkjhfkas

Code:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomReader {

	public static void main(String[] args) {
		File file = new File("c:/test.vdb");
		RandomAccessFile raf = null;
		try {
			raf = new RandomAccessFile(file, "r");
			String line = null;

			//Hier lassen wir uns mal alle Zeilen und die Offsets der Zeilen anfänge ausgeben
			//			while( (line = raf.readLine())!= null){
			//				System.out.println(raf.getFilePointer());
			//				System.out.println(line);
			//			}

			//Hier hat die Zeile 7 in meinem Beispiel das Offset 165
			//mit dem Aufruf von readLine() ab dieser Position wird jedoch die 
			//nächste Zeile ausgelesen -> Zeile 8 
			raf.seek(165L);
			line = raf.readLine();
			System.out.println(line);

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (raf != null)
				try {
					raf.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
		}

	}
}

Oder so:

Code:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class RandomReader {

	public static void main(String[] args) {
		File file = new File("c:/test.vdb");
		BufferedReader br = null;
		try {
			String line = null;

			br = new BufferedReader(new FileReader(file));
			long charCnt = 0L;

			//Zur Ermittlung der Testwerte: (Anhand der Beispieldatei)

			//			while((line = br.readLine())!= null){
			//				
			//				charCnt += line.length() + 1; //+1 wegen \n Zeichen...
			//											  //+2 bei \r\n Zeichen...
			//				//Anzahl der bis jetzt gelesenen Zeichen ausgeben
			//				System.out.println(charCnt);
			//				//Gelesene Zeichen ausgeben
			//				System.out.println(line);
			//			}

			//Nur letzte Zeile ausgeben:
			br.skip(243L);
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (br != null)
				try {
					br.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
		}
	}
}

HTH
Gruß Tom
 
Hallo,

wenn du es mit eine RandomAccessFil löst, musst du alles ab der Zeile die du änderst neu in die Datei schreiben.

Wenn du es mit einem Writer oder OutputStream machst, musst du die komplette Datei neu schreiben.

MFG

zEriX
 
Zurück