wake-up-neo.com

Wie liest man eine Datei aus dem relativen Pfad in einem Java-Projekt? Java.io.File kann den angegebenen Pfad nicht finden

Ich habe ein Projekt mit 2 Paketen: 

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

Im Paket (2) habe ich eine Textdatei ListStopWords.txt, im Paket (1) habe ich eine Klasse FileLoadder. Hier ist der Code in FileLoader:

File file = new File("properties\\files\\ListStopWords.txt");

Aber habe diesen Fehler:

The system cannot find the path specified

Können Sie eine Lösung geben, um das Problem zu beheben? Vielen Dank.

96
tiendv

Wenn es sich bereits im Klassenpfad befindet, beziehen Sie es einfach aus dem Klassenpfad und nicht aus dem Festplattendateisystem. Spielen Sie in Java.io.File nicht mit relativen Pfaden. Sie hängen vom aktuellen Arbeitsverzeichnis ab, über das Sie im Code Java keinerlei Kontrolle haben.

Angenommen, ListStopWords.txt befindet sich im selben Paket wie Ihre Klasse FileLoader, dann tun Sie Folgendes:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

Oder wenn alles, was Sie letztendlich suchen, tatsächlich ein InputStream davon ist:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

Dies ist sicherlich der Erstellung einer new File() vorzuziehen, da url nicht unbedingt einen Pfad für das Plattendateisystem darstellt, sondern auch einen Pfad für das virtuelle Dateisystem (was vorkommen kann, wenn die JAR-Datei in den Arbeitsspeicher anstatt in eine temporäre Datei erweitert wird) Ordner auf dem Festplatten-Dateisystem) oder sogar einen Netzwerkpfad, die beide nicht per Definition vom Konstruktor File verdaulich sind.

Wenn die Datei - wie der Paketname andeutet - ist tatsächlich eine vollwertige Eigenschaftendatei (enthält key=value Zeilen ) mit nur der "falschen" Erweiterung, dann könnten Sie die InputStream sofort der load() -Methode zuführen.

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

Hinweis: Wenn Sie versuchen, aus dem Kontext static darauf zuzugreifen, verwenden Sie FileLoader.class (oder was auch immer YourClass.class) anstelle von getClass() in den obigen Beispielen.

152
BalusC

Die folgende Zeile kann verwendet werden, wenn der relative Pfad der Datei angegeben werden soll.

File file = new File("./properties/files/ListStopWords.txt");  
37
santhosh

Der relative Pfad funktioniert in Java mit der. Operator.

  • . bedeutet denselben Ordner wie der aktuell ausgeführte Kontext.
  • .. bezeichnet den übergeordneten Ordner des aktuell laufenden Kontexts.

Die Frage ist also, woher wissen Sie den Pfad, in den Java aktuell sucht.

mache ein kleines experiment

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

Beobachten Sie die Ausgabe, Sie werden das aktuelle Verzeichnis kennen, in dem Java sucht. Von dort aus können Sie Ihre Datei einfach mit dem Operator ./ suchen.

zum Beispiel, wenn die Ausgabe ist 

G:\Java8Ws\MyProject\Inhalt.

und Ihre Datei ist im Ordner MyProject vorhanden 

File resourceFile = new File("../myFile.txt");

Hoffe das hilft

19
Samrat
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}
7

probiere .\properties\files\ListStopWords.txt

5
bUg.

Die von BalusC gelieferte Antwort funktioniert zwar für diesen Fall, wird jedoch unterbrochen, wenn der Dateipfad Leerzeichen enthält, da diese in einer URL in% 20 konvertiert werden, was keinen gültigen Dateinamen darstellt. Wenn Sie das File-Objekt mit einem URI statt mit einem String erstellen, werden Whitespaces korrekt behandelt:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());
3
Mark Krijgsman

Ich hätte es kommentieren können, aber ich habe weniger Vertreter dafür ... Samrat's Antwort hat die Aufgabe für mich erledigt. Es ist besser, den aktuellen Verzeichnispfad anhand des folgenden Codes zu sehen.

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

Ich habe es einfach verwendet, um ein Problem zu beheben, mit dem ich in meinem Projekt konfrontiert war. Verwenden Sie ./, um zum übergeordneten Verzeichnis des aktuellen Verzeichnisses zurückzukehren.

    ./test/conf/appProperties/keystore 
1
Aditya Bhardwaj

Ich wollte 'command.json' in src/main // js/Simulator.Java analysieren. Dafür habe ich die Json-Datei in den SRC-Ordner kopiert und den absoluten Pfad wie folgt angegeben:

Object obj  = parser.parse(new FileReader("./src/command.json"));
0
sver