Gibt es eine Möglichkeit, aus einer Datei zu lesen, die sich im selben Ordner wie die .jar-Datei befindet? Ich versuche, ein Java-Programm zu erstellen, das aus einer Datei lesen muss, wenn ich meine Aufgabe einstelle. Ich weiß nicht, wo die Datei oder das Programm gehalten wird, sobald ich es umgebe, also glaube ich nicht, dass ich das Verzeichnis der gehaltenen Datei kodieren kann. Ist das möglich? Das Problem ist, dass ich die Datei auf einen CSX-Host-Server hochladen muss, der ein Linux-Server ist, und ihn von dort aus ausführen. Wenn ich keinen Pfad vor die Datei lege, wird nur der aktuelle Speicherort gesucht?Lesen von einer Datei, die sich im selben Ordner wie die .jar-Datei befindet
Antwort
Wie in den Kommentaren erwähnt, funktioniert dies nur, wenn Sie den Befehl aus dem Verzeichnis des Glas ist in laufen.
(Im Zusammenhang mit einer Desktop-Anwendung)
eine Datei zuzugreifen, ist Im aktuellen Verzeichnis der jar
sollte der path
Datei ein Punkt vorangestellt sein. Beispiel:
String path = "./properties.txt";
FileInputStream fis = new FileInputStream(path);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
// Read the file contents...
In diesem Beispiel gibt es eine Textdatei properties.txt
im selben Verzeichnis wie die jar
genannt.
Diese Datei wird von dem in jar
enthaltenen Programm gelesen.
Bearbeiten: Sie sagten, der Dateiname würde nicht ändern, und diese Antwort gilt, vorausgesetzt, dass Sie den Namen im Voraus natürlich wissen, sollten Sie es vorziehen, es hart zu codieren.
Dies ist eine viel sauberere Lösung als meine, aber es behandelt nicht alle Fälle. Manchmal ist das aktuelle Verzeichnis (das.) Nicht dasselbe wie das Verzeichnis, das das Anwendungs-Jar enthält. Angenommen, Ihr jar heißt app.jar und befindet sich in einem Verzeichnis mit dem Namen target; Wenn der Grader "java -jar app.jar" aus dem Zielverzeichnis eingeben soll, funktioniert Ihre Lösung. Wenn der Grader jedoch den Java-Befehl eine Ebene außerhalb der App ausführen würde, z. "java -jar ./target/app.jar", dann sucht Ihre Lösung nach der Eingabedatei außerhalb des Zielverzeichnisses und würde sie daher nicht finden. – Darwyn
Ich war überzeugt, dass der Punkt immer dem aktuellen Standort des laufenden Glases zugeordnet würde. Danke, dass du das unterstrichen hast! – afsantos
Das Hinzufügen von './' vor dem Dateinamen führt genau zu nichts. "Das aktuelle Verzeichnis der JAR" ist nicht dasselbe wie "derselbe Ordner wie die .jar". -1 – EJP
Basierend auf Ihren Kommentaren denke ich, Ihre beste Lösung wäre, den absoluten Pfad der hochgeladenen Datei in den Jar zu übergeben.
Sie können den Pfad in das Jar als Befehlszeilenargument übergeben. Da sich Pfad und Dateiname nicht ändern und Sie Linux ausführen, können Sie ein SH-Skript erstellen, um es auszuführen.
Dies befreit Sie auch von Hardcoding in einem Dateipfad oder Dateinamen in den Jar.
public class TestClassLoaderAccess {
public static void main(String[] argv) {
TestClassLoaderAccess me = new TestClassLoaderAccess();
ClassLoader myLoader = me.getClass().getClassLoader();
System.out.println(myLoader.getClass().getSuperclass().getName());
java.net.URLClassLoader myUrlLoader = (java.net.URLClassLoader) myLoader;
java.net.URL resource = myUrlLoader.findResource("TestClassLoaderAccess.class");
System.out.println(resource.toString());
}
}
Lauf es:
C:\JavaTools>javac TestClassLoaderAccess.java
C:\JavaTools>java TestClassLoaderAccess
java.net.URLClassLoader
file:/C:/JavaTools/TestClassLoaderAccess.class
C:\JavaTools>
(Der erste println wird nur um zu beweisen, dass der Klassenlader eine Unterklasse von URLClassLoader ist.) Kann
Dies findet eine Ressource * innerhalb * der JAR. Es funktioniert nur hier, weil es überhaupt kein JAR gibt. Nicht, wonach gefragt wurde. Keine Antwort. – EJP
, wenn die Eingabedatei fest einprogrammiert werden und Sie wissen, dass es sich immer im selben Verzeichnis befindet wie das jar mit dem Code, dann sollte das funktionieren:
* "Das sollte funktionieren:" * Es würde nicht in einem Applet oder irgendeiner Anwendung funktionieren, die mit JWS gestartet wurde, wahrscheinlich auch kein Servlet. Selbst Sun sagte uns schon lange WTE, "versuche nicht, die ausführbare Datei ausfindig zu machen - es ist keine der Apps. Business". –
Wahr, dass es in einem Applet fehlschlägt, oder wenn es von Java Web Start gestartet wird oder wenn es auf einem Anwendungsserver ausgeführt wird (z. B. OSGi, IBM WebSphere, Oracle WebLogics usw.). Aber es wird als normale Desktop-Java-Anwendung funktionieren. – Darwyn
Desktop-App.? * "Ein Linux-Server und von dort aus ausführen" * Scheint nicht wie der Desktop für mich. –
Um es "in sich geschlossen" zu machen, setzen Sie die Ressource innerhalb der Jar. Es wird dann ein (nur lesen) embedded resource, für die wir eine URL mit etwas entlang der Linien von erhalten:
URL url = this.getClass().getResource("/path/to/the.resource");
Sie können den Speicherort der JAR-Datei erhalten enthält eine bestimmte Klasse über:
URL url = thisClass.getProtectionDomain().getCodeSource().getLocation();
Von dort ist es einfach, eine URL zu der gewünschten Datei zu relativieren.
Hier ist, wie Sie einen sauberen Verzeichnispfad zu Ihrer JAR-Datei erhalten (Basierend auf EJP Antwort):
URL url = IssueInfoController.class.getProtectionDomain().getCodeSource().getLocation();
String urlString = url.toString();
int firstSlash = urlString.indexOf("/");
int targetSlash = urlString.lastIndexOf("/", urlString.length() - 2) + 1;
return urlString.substring(firstSlash, targetSlash) + YOUR_FILE;
Sollte 'URL.getPath()' statt all dies verwenden. – EJP
@kcpr - Danke für die angebotenen Lösungen. Unten arbeitete einer für mich.
private static String CONFIG_FILE_LOCATION = "lib"+ File.separator + "Config.properties";
static {
File jarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
String inputFilePath = jarFile.getParent() + File.separator + CONFIG_FILE_LOCATION;
propConfig = new PropertiesConfiguration(new File(inputFilePath));
propConfig.load();
}
- 1. Wie wird die Eigenschaftendatei geladen, die sich im Assets-Ordner von Android Studio befindet?
- 2. Verwenden Benutzersteuerung im selben Ordner wie die Seite
- 3. Wie ein Prozess im selben Ordner wie die ausführbaren Datei starten
- 4. Protokolldateien im selben Ordner wie Protokolldatei teilen
- 5. Wie kann ich eine Verknüpfung zu einer Datei herstellen, die sich in einem Ordner außerhalb des Ordners befindet, in dem sich meine Datei befindet?
- 6. Öffnen von Dateien im selben Ordner wie die aktuelle Datei, in vim
- 7. Überprüfen Sie, ob sich die Datei im (Unter) Verzeichnis befindet
- 8. Wo befindet sich die Datei widgets/foreign.html im Django-Stamm?
- 9. Datei vom selben Server lesen
- 10. Eine Datei im gleichen Verzeichnis wie die Klasse lesen?
- 11. Fehler Dateipfad verweigert, aber die Datei befindet sich im Ordner (Einmaliger Erfolg anderer Fehler) C#
- 12. Importieren von Dateien im selben Ordner
- 13. QSettings - wo befindet sich die Ini-Datei?
- 14. Wo befindet sich die Core Data-Datei?
- 15. Ist es möglich, .CSS-Datei zu bearbeiten, während sich die .SCSS-Datei nicht im selben Stammordner befindet?
- 16. Lesen Sie die version.properties-Datei im Stammverzeichnis
- 17. Wie kann ich herausfinden, wo sich die Datei httpd.conf befindet?
- 18. Adobe AIR - Lesen einer Datei im selben Ordner außerhalb des AIR-Pakets
- 19. Wie importiere ich aus einer Python-Datei in einem Ordner und einer Datei im selben Verzeichnis, das aufgerufen wird?
- 20. Wie referenziere ich eine Baugruppe, die sich im GAC befindet?
- 21. Verschieben Sie die Anzahl der Ordner rekursiv in einen anderen Ordner im selben Ordner mit PowerShell
- 22. Ich vertraue einer Assembly, die sich auf einer Netzwerkfreigabe befindet
- 23. Webpart befindet sich im Bearbeitungsmodus?
- 24. AngularJS: JSON-Datei im selben Ordner (lokal) laden
- 25. Wo befindet sich die Datei "content_my.xml" in Android Studio?
- 26. Die Layoutdatei ist vorhanden, befindet sich jedoch nicht im Layoutordner. Wo finde ich die Layoutdatei?
- 27. Wie wird die Anzahl der Benachrichtigungen behandelt, wenn sich die App im Hintergrund im Firebase befindet?
- 28. Wie kann ich eine Datei lesen, die ich im selben Programm erstellt habe, C++?
- 29. Wo befindet sich die NetBeans-Konfigurationsdatei (netbeans.conf)?
- 30. Wie lösche ich die Datei aus dem Ordner im Codezeichner?
Was ist Ihr Kontext: Applet oder Desktop? Kannst du die Datei als Ressource in das JAR einfügen? – Aubin
Kann Ihr Programm den Pfad zur Datei als Befehlszeilenargument verwenden? – dnault
Verwenden Sie ClassLoader.findResource, um Ihre Klasse zu finden. Dekodieren Sie die resultierende URL, um herauszufinden, wo sie sich befindet. –