2013-02-19 11 views
12

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

+0

Was ist Ihr Kontext: Applet oder Desktop? Kannst du die Datei als Ressource in das JAR einfügen? – Aubin

+0

Kann Ihr Programm den Pfad zur Datei als Befehlszeilenargument verwenden? – dnault

+1

Verwenden Sie ClassLoader.findResource, um Ihre Klasse zu finden. Dekodieren Sie die resultierende URL, um herauszufinden, wo sie sich befindet. –

Antwort

13

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.

+8

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

+0

Ich war überzeugt, dass der Punkt immer dem aktuellen Standort des laufenden Glases zugeordnet würde. Danke, dass du das unterstrichen hast! – afsantos

+2

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

0

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.

+0

Beantwortet die Frage nicht. Lies es nochmals. Er weiß nicht, wo die Datei sein wird. – EJP

+0

In für Ihre jährliche Überprüfung auf alte Fragen? – aglassman

+2

Wahrheit ist keine Funktion der Zeit. – EJP

-1
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

+0

Dies findet eine Ressource * innerhalb * der JAR. Es funktioniert nur hier, weil es überhaupt kein JAR gibt. Nicht, wonach gefragt wurde. Keine Antwort. – EJP

2

, 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:

+2

* "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". –

+0

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

+1

Desktop-App.? * "Ein Linux-Server und von dort aus ausführen" * Scheint nicht wie der Desktop für mich. –

1

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"); 
19

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.

0

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; 
+1

Sollte 'URL.getPath()' statt all dies verwenden. – EJP

0

@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(); 
} 
Verwandte Themen