Java, eine Datei aus dem aktuellen Verzeichnis lesen?

79

Ich möchte ein Java-Programm, das einen benutzerdefinierten Dateinamen aus dem aktuellen Verzeichnis liest (dasselbe Verzeichnis, in dem die .class-Datei ausgeführt wird).

Mit anderen Worten, wenn der Benutzer den Dateinamen "myFile.txt" angibt und sich diese Datei bereits im aktuellen Verzeichnis befindet:

reader = new BufferedReader(new FileReader("myFile.txt"));

funktioniert nicht. Warum?

Ich lasse es in Windows laufen.

Saobi
quelle
1
Dies ist auch unter Linux so
Kasun Siyambalapitiya

Antworten:

50

Das aktuelle Verzeichnis ist nicht (unbedingt) das Verzeichnis, in dem sich die .class-Datei befindet. Es ist das Arbeitsverzeichnis des Prozesses. (dh: das Verzeichnis, in dem Sie sich befanden, als Sie die JVM gestartet haben)

Sie können mit getResourceAsStream () Dateien aus demselben Verzeichnis * wie die .class-Datei laden . Dadurch erhalten Sie einen InputStream, den Sie mit InputStreamReader in einen Reader konvertieren können .


* Beachten Sie, dass dieses "Verzeichnis" tatsächlich eine JAR-Datei sein kann, je nachdem, von wo die Klasse geladen wurde.

Laurence Gonsalves
quelle
15
+1. Wenn Sie eine IDE wie Eclipse oder Idea ausführen, ist das aktuelle Verzeichnis das Projektverzeichnis und nicht die Compilerausgabe.
Denis Tulskiy
2
@piiligrim, hängt von Ihrer Startkonfiguration ab
Thorbjørn Ravn Andersen
@DenisTulskiy Ich arbeite an Eclipse genauso wie die Beispielperson. Meins funktioniert immer noch nicht. Warum ist das so?
Windsound
77

Versuchen

System.getProperty("user.dir")

Es gibt das aktuelle Arbeitsverzeichnis zurück.

Joonas Pulakka
quelle
6
Es wird jedoch nur der Pfad bis zum Stammverzeichnis des Projekts zurückgegeben. Wie können wir den Pfad des aktuellen Pakets in der Hauptmethode von Java erhalten
Taimoor Changaiz
32

Keine der obigen Antworten funktioniert für mich. Folgendes funktioniert bei mir.

Angenommen, Ihr Klassenname lautet Foo.java. Verwenden Sie diesen Code, um auf die Datei myFile.txt im selben Ordner wie Foo.java zuzugreifen:

URL path = Foo.class.getResource("myFile.txt");
File f = new File(path.getFile());
reader = new BufferedReader(new FileReader(f));
Tony Vu
quelle
1
Ich kann nicht auf die Datei zugreifen. NullPointerException in path.getFile geben.
Avik Chowdhury
15

Dateien in Ihrem Projekt stehen Ihnen relativ zu Ihrem src-Ordner zur Verfügung. Wenn Sie wissen, in welchem ​​Paket oder Ordner sich myfile.txt befindet, sagen Sie, dass es sich in befindet

----src
--------package1
------------myfile.txt
------------Prog.java

Sie können den Pfad in "Proc.java" als "src / package1 / myfile.txt" angeben

Katwekibs
quelle
4

Wenn Sie wissen, dass Ihre Datei dort gespeichert ist, wo sich Ihre Klassen befinden, befindet sich dieses Verzeichnis in Ihrem Klassenpfad. In diesem Fall können Sie sicher sein, dass diese Lösung Ihr Problem löst:

URL path = ClassLoader.getSystemResource("myFile.txt");
if(path==null) {
     //The file was not found, insert error handling here
}
File f = new File(path.toURI());

reader = new BufferedReader(new FileReader(f));
Joel Westberg
quelle
1

Versuche dies:

BufferedReader br = new BufferedReader(new FileReader("java_module_name/src/file_name.txt"));
Ashwin
quelle
0

versuchen Sie es mit "." Z.B

File currentDirectory = new File(".");

Das hat bei mir funktioniert

Charlie
quelle