Ich habe eine Datei in meinem Klassenpfad, z com/path/to/file.txt
. Ich muss diese Datei als java.io.File
Objekt laden oder referenzieren . Dies liegt daran, dass ich mit auf die Datei zugreifen muss java.io.RandomAccessFile
(die Datei ist groß und ich muss nach einem bestimmten Byte-Offset suchen). Ist das möglich? Die Konstruktoren für RandomAccessFile
benötigen eine File
Instanz oder einen String (Pfad).
Wenn es eine andere Lösung gibt, um einen bestimmten Byte-Offset zu suchen und die Zeile zu lesen, bin ich auch dafür offen.
Antworten:
Versuchen Sie, eine URL für Ihre Klassenpfadressource zu erhalten:
URL url = this.getClass().getResource("/com/path/to/file.txt")
Erstellen Sie dann eine Datei mit dem Konstruktor, der einen URI akzeptiert:
File file = new File(url.toURI());
quelle
Dies funktioniert auch und erfordert keine URI-Konvertierung von / path / to / file. Befindet sich die Datei im Klassenpfad, wird sie gefunden.
File currFile = new File(getClass().getClassLoader().getResource("the_file.txt").getFile());
quelle
File
Konstruktor übergibtIch finde diesen einzeiligen Code am effizientesten und nützlichsten:
File file = new File(ClassLoader.getSystemResource("com/path/to/file.txt").getFile());
Klappt wunderbar.
quelle
File file = new File(ClassLoader.getSystemResource("com/path/to/file.txt").toURI());
Oder verwenden Sie direkt die
InputStream
Ressource unter Verwendung des absoluten CLASSPATH-Pfads (beginnend mit dem/
Schrägstrich):getClass().getResourceAsStream("/com/path/to/file.txt");
Oder relativer CLASSPATH-Pfad (wenn sich die Klasse, die Sie schreiben, im selben Java-Paket befindet wie die Ressourcendatei selbst, dh
com.path.to
):getClass().getResourceAsStream("file.txt");
quelle
java.io.InputStream.skip(long)
Methode kann man zu einem bestimmten Versatz in einer Datei springen und dann beispielsweise mit derjava.io.BufferedReader.readLine()
Methode eine Zeile lesen . Die Frage zielte auch auf andere Lösungen als nur dieRandomAccessFile
eine.