So laden / referenzieren Sie eine Datei als Dateiinstanz aus dem Klassenpfad

72

Ich habe eine Datei in meinem Klassenpfad, z com/path/to/file.txt. Ich muss diese Datei als java.io.FileObjekt 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 RandomAccessFilebenötigen eine FileInstanz 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.

jake
quelle
Das Ende-zu-Ende-Beispiel ist hier für Details: [ stackoverflow.com/questions/1464291/…
ravibeli

Antworten:

230

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());
joelittlejohn
quelle
25
Gibt es eine Chance, dass Sie diese Antwort mit dem großen grünen Häkchen akzeptieren? :)
Joelittlejohn
18
@jake mit 235 Wiederholungen sollten Sie dies jetzt als Antwort markieren können.
John Ruiz
18
@ Jake komm schon du kannst es tun: D
Saikat
8
@jake Fast 6 Jahre später warten immer noch auf Jake, um diese Antwort zu akzeptieren
kshah
11
@jake Glaubst du nach all den Jahren, dass diese Antwort dein Problem gelöst hat? Klicken Sie einfach auf das grüne Ding.
lpratlong
47

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());
Hotel
quelle
1
Dies funktionierte bei mir, während dies nicht der Fall war: URL url = this.getClass (). GetResource ("/ com / path / to / file.txt"). War dies, weil sich die Datei, die ich lud, in einem Ordner namens "resource" befand und nicht in einem Paket / Ordner, das von "this.getClass ()" freigegeben wurde? Trotzdem danke.
Thebiggestlebowski
1
Wirklich prägnante Antwort.
Harihar Das
3
Dies funktioniert nicht, wenn der Ressourcenpfad (oder ein übergeordneter Pfad einer relativen Ressource) Leerzeichen enthält. getFile () gibt eine URL-codierte Zeichenfolge mit% 20s zurück, die der File (String) -Konstruktor wörtlich interpretiert. @joelittlejohn Antwort unten wird diesen Fall korrekt behandeln, da es eine URI an den FileKonstruktor übergibt
dan carter
19

Ich finde diesen einzeiligen Code am effizientesten und nützlichsten:

File file = new File(ClassLoader.getSystemResource("com/path/to/file.txt").getFile());

Klappt wunderbar.

Gondy
quelle
Dies hat bei mir funktioniert und ist die sauberste Antwort auf dieser Seite.
Jeremy
5
Dies funktioniert nicht, wenn der Ressourcenpfad (oder ein übergeordneter Pfad einer relativen Ressource) Leerzeichen enthält. getFile () gibt eine URL-codierte Zeichenfolge mit% 20s zurück, die der File (String) -Konstruktor wörtlich interpretiert. Die unten stehende Antwort von @joelittlejohn behandelt diesen Fall korrekt, da ein URI an den Dateikonstruktor übergeben wird. Sollte seinFile file = new File(ClassLoader.getSystemResource("com/path/to/file.txt").toURI());
dan carter
5

Oder verwenden Sie direkt die InputStreamRessource 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");

Jiri Patera
quelle
Und wie würde dies dem Originalposter ermöglichen, java.io.RandomAccessFile zu verwenden?
Joelittlejohn
Ich gebe zu, Ihre Antwort ist korrekter, und deshalb habe ich sie abgelehnt. Mit der java.io.InputStream.skip(long)Methode kann man zu einem bestimmten Versatz in einer Datei springen und dann beispielsweise mit der java.io.BufferedReader.readLine()Methode eine Zeile lesen . Die Frage zielte auch auf andere Lösungen als nur die RandomAccessFileeine.
Jiri Patera