2016-08-06 48 views
0

Hallo und vielen Dank, dass Sie sich die Zeit genommen haben, sich diese Frage anzusehen.Zugriff auf Textdatei im Ordner für parallele Ressourcen unter Verwendung des relativen Pfads

Ich habe Probleme beim Zugriff auf eine Textdatei in einem Ordner parallel zu meinem Src-Ordner (siehe unten für Struktur).

Der nächste, den ich zu einer Erklärung gefunden habe, ist hier: https://www.cis.upenn.edu/~matuszek/cit597-2006/Pages/finding-files.html und ich bin auf viele ähnliche Fragen gestoßen, aber keine, von denen ich die Antwort auf diese leider ableiten kann.

Ich weiß, ich könnte absolute Pfade verwenden, aber ich möchte sicherstellen, dass diese Software auf den Computern anderer Leute funktioniert, so dass es ein No-Go ist. Daher versuche ich, es mit relativen Pfaden arbeiten zu lassen.

Als Bonus wird hier vorgeschlagen: https://coderanch.com/t/464197/java/java/Reading-files-directory-giving-relative dass, damit dieser Code innerhalb einer JAR-Datei funktioniert, ich getResourceAsStream() verwenden muss. Könnte jemand beraten?

Ich versuche Recipes.txt zugreifen aus RecipeReader.java, hier ist mein Code so weit:

 Class thisClass = this.getClass(); 
     ClassLoader loader = thisClass.getClassLoader(); 
     URL recipeFileURL = loader.getResource("Recipes.txt"); 
     String path = recipeFileURL.getPath(); 
     path.replaceAll("%20", " "); 
     BufferedReader input = new BufferedReader(new FileReader(path)); 

und in ähnlicher Weise auf die gleiche Datei zu schreiben:

 Class thisClass = this.getClass(); 
     ClassLoader loader = thisClass.getClassLoader(); 
     URL recipeFileURL = loader.getResource("Recipes.txt"); 
     String path = recipeFileURL.getPath(); 
     path.replaceAll("%20", " "); 
     BufferedWriter output = new BufferedWriter(new FileWriter(path)); 

Danke im Voraus für Ihre Hilfe!

Robin

Eclipse Tree View

Antwort

3

Wenn die Dateien in Ihrer JAR-Datei gebündelt werden, dann Dateien sind sie nicht mehr: das Dateisystem nicht diese Dateien zur Laufzeit enthält, da sie in eingebettet sind die JAR-Datei. So können Sie NICHT Datei IO verwenden, um sie zu lesen. new FileReader(path) macht keinen Sinn.

Es scheint auch, dass Sie den Inhalt dieser Ressourcen ändern möchten. Dies ist definitiv nicht möglich, wenn die Ressourcen in der JAR-Datei eingebettet sind.

Sie müssen also darüber nachdenken, was Sie wirklich tun möchten und wie Sie die Anwendung Ihren Endbenutzern zur Verfügung stellen und installieren.

Wenn die Dateien statische, schreibgeschützte Ressourcen enthalten, die von der Anwendung benötigt werden, sollten sie in der JAR-Datei gebündelt und mit dem ClassLoader gelesen werden.

Wenn die Dateien Daten sind, die von der Anwendung gelesen und gespeichert werden müssen, so wie es ein Texteditor tun würde, dann ist es wahrscheinlich nicht sinnvoll, sie mit der Anwendung zu versehen: Fragen Sie einfach den Benutzer, wo er laden soll/speichere die Dateien.

Wenn es sich um Einstellungen handelt, die von der Anwendung transparent geladen und gespeichert werden müssen, können Sie sie beispielsweise in einer .myApp.prefs-Datei im Ausgangsverzeichnis des Benutzers laden und speichern.

+0

Ausgezeichnet, vielen Dank für das Teilen. Es scheint, dass meine ursprüngliche Frage eher redundant ist, da der Benutzer einfach einen Speicherort auswählen kann, an dem er die Dateien speichern möchte. Dies mag jedoch eine kleine Frage sein, aber wie würden Sie den Dateipfad speichern, den der Benutzer in das Java-Programm eingibt, wenn es bereits kompiliert ist? Es scheint ein wenig Huhn und Ei zu sein, da Sie eine editierbare Datei an einem Ort haben müssten, von dem Sie den Speicherort Ihrer anderen bearbeitbaren Datei gelesen haben! Vielen Dank für Ihre Zeit und Ihr Wissen, es wird sehr geschätzt –

+0

Ich verstehe Ihre Frage nicht. Können Sie mir bitte erklären, was Sie vorhaben? –

0

Normalerweise werden Sie Ihre Ressource in einem Ordner speichern, der dem Paketnamen der Klasse entspricht, die sie lädt.

Zum Beispiel würden Sie dies haben:

package com.robhartley.application; 

public class ResourceLoader { 
    public List<Recipe> loadRecipes() { 
     InputStream inputStream = getClass().getResourceAsStream("Recipes.txt"); 
     // ... 
    } 
} 

mit der folgenden Datei in Ihrem Projekt: resources/com/robhartley/application/Recipes.txt.