2012-03-29 12 views
1

Ich habe überall nach diesem gesucht, aber ich kann es nicht herausfinden.Eine Datei in ein JAR packen und dann in das richtige Verzeichnis verschieben

Ich mache eine Anwendung in Java, die die Midi-Bibliothek verwendet. Um diese Anwendung auszuführen, muss der Benutzer eine SoundBank-Datei (soundbank.gm) in seinem JRE-Installationsordner in lib/audio haben. Ich möchte nicht, dass der Benutzer das selbst herausfinden muss, also hoffte ich, ich könnte die Soundbank einfach als Ressource in der Anwendung paketieren und wenn die Anwendung gestartet wird, könnte ich sie programmgesteuert in das richtige Verzeichnis verschieben, wenn sie es tut war nicht da.

Also zuerst muss ich wissen, wie man eine Ressource wie in der JAR packen. Dann muss ich wissen, wie man die Ressource in ein anderes Verzeichnis kopiert. Ich weiß, wie man normale Dateien kopiert, aber ich bin nicht sicher, wie ich auf eine Datei in einem JAR zugreifen könnte.

Jede Hilfe wäre willkommen. Ich verwende Eclipse BTW, um eine ausführbare JAR zu exportieren.

EDIT: Ich habe gerade herausgefunden, der Grund, dass meine Datei nicht in der JAR verpackt wurde, weil ich es nicht als Quellordner in Eclipse deklariert habe. Wie kann ich auf diese Datei in Java zugreifen? Kann ich den JAR-Namen einfach als Ordnernamen behandeln?

+0

Dies kann Ihnen eine Anleitung geben: http://www.cefns.nau.edu/~edo/Classes/CS477_WWW/Docs/pack_resources_in_jar.html. –

Antwort

2

Eine direkte Art und Weise zu tun, Das heißt, Sie greifen auf Ihre Java-Ressource als Stream zu und kopieren sie dort, wo Sie möchten, zum Beispiel mit der commons IOUtils-Dienstprogrammklasse:

InputStream is = MyInstallerClass.class.getResourceAsStream("/path/to/my/resource"); 
OutputStream os = new FileOutputStream("/path/to/install/directory"); 
org.apache.commons.io.IOUtils.copy(is,os); 
2

Um Ressourcen in JAR-Datei verpackt zuzugreifen (oder irgendwo nur in Classpath) von Java-Anwendung können Sie verwenden:

getClass().getResourseasStream("path/to/resource"); 

Wenn Ressource im gleichen Paket wie die Klasse ist, dass Sie brauchen nur Ressourcennamen ohne beliebiger Pfad (zB wie aktuelles Verzeichnis) wenn sich die Ressource im anderen Paket befindet, können Sie den absoluten Pfad verwenden. Siehe das Javadoc für Class.getResourseAsStream(). Sobald du den Stream bekommen hast, kannst du ihn lesen, kopieren, usw., wie du es normalerweise mit jedem Stream machen würdest.

1

Nehmen wir an, Sie verpacken soundback.gm unter "Ressourcen" in Ihrem JAR.

Sie könnten dann verwenden Sie die folgende diese Datei zugreifen ...

ClassLoader cl = this.getClass().getClassLoader(); 
InputStream is = cl.getResourceAsStream("resources/soundback.gm"); 

Sie könnten dann konvertieren, die Input in eine Datei über das ...

OutputStream out = new FileOutputStream(new File("/lib/audio/soundback.gm")); 

int read = 0; 
byte[] bytes = new byte[1024]; 

while ((read = is.read(bytes)) != -1) { 
    out.write(bytes, 0, read); 
} 

is.close(); 
out.flush(); 
out.close();