Gibt es eine möglichkeit Dateien aus der jar datei zu kopieren?

Diskutiere Gibt es eine möglichkeit Dateien aus der jar datei zu kopieren? im AWT, Swing, JavaFX & SWT Bereich.
VPChief

VPChief

Ich habe ein programm erstellt, dass eine datei aus seinem src Ordner kopiert. Beim Starten in der Entwicklungsumgebung (Eclipse) funktioniert es.
So lade ich die Datei

Code:
/Test folder/Test File.exe
Die zu startende datei sollte auch eigentlich ein Icon haben, hat sie aber nicht und ausserdem 0KB

1598723867154.png

Das ist dann die Fehlermeldung die ich beim Starten bekomme

1598723790549.png

So siehts momentan im Jar aus
1598724114590.png

Ich habe den Ordner Test folder (obwohl ich es besser weiss) auch schon neben den src ordner geschoben, dann wars gleich.

Und ich weiss, dass es nicht so einfach ist, wenn auch nicht möglich, aber jede möglichkeit ist willkommen.

Ich hoffe, dass dieses Problem gelöst wird, denn sonst werde ich viele meiner projekte ni fertigstellen können

Danke im vorraus
 
Zuletzt bearbeitet:
sascha-sphw

sascha-sphw

Vermutlich ist es eine 64Bit Anwendung und ein 32Bit Betriebsystem.
 
VPChief

VPChief

Ok, schaue ich mir morgen dann genauer an, danke erstmal. Bei weiteren fragen wende ich mich nochmal an euch
 
VPChief

VPChief

So lade ich die Datei

Code:
/Test folder/Test File.exe
Das zeigt nicht wirklich, wie du Datei lädtst. Das ist doch nur ein Pfad.
Sorry, so gebe ich den Pfad zur datei an.

So lade ich die datei:
Code:
  File inF = new  File("/Test folder/Test File.exe");
So kopiere ich:
Java:
JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnValue = fileChooser.showOpenDialog(null);
        if (returnValue == JFileChooser.APPROVE_OPTION) {
          File selectedFile = fileChooser.getSelectedFile();
          PrintWriter writer = null;
          try {
        targetFile = new File(selectedFile, "Test File.exe");
        System.out.println(targetFile);
            writer = new PrintWriter(targetFile);
            File outF = new  File("" + targetFile);
            try {
                copyFile(inF, outF);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          } catch (IOException ae) {
            ae.printStackTrace();
          }  finally {
            if (writer != null) {
              writer.flush();
              writer.close();
            }
          } 
        }
    private static void copyFile(File inF, File outF) throws IOException {
        FileChannel inChannel = null;
        FileChannel outChannel = null;
        try {
            inChannel = new FileInputStream(inF).getChannel();
            outChannel = new FileOutputStream(outF).getChannel();
            inChannel.transferTo(0, inChannel.size(), outChannel);
        } catch (IOException e) {
            throw e;
        } finally {
            try {
                if (inChannel != null)
                    inChannel.close();
                if (outChannel != null)
                    outChannel.close();
            } catch (IOException e) {}
        }
    
    }
java.nio.file.NoSuchFileException: \Test folder.zip
at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:53)
at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:38)
at java.base/sun.nio.fs.WindowsFileSystemProvider.readAttributes(WindowsFileSystemProvider.java:198)
at java.base/java.nio.file.Files.readAttributes(Files.java:1843)
at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1160)
at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:717)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:237)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:167)
at java.base/java.util.jar.JarFile.<init>(JarFile.java:347)
at java.base/java.util.jar.JarFile.<init>(JarFile.java:318)
at java.base/java.util.jar.JarFile.<init>(JarFile.java:284)
at test.main(test.java:12)
Exception in thread "main" java.lang.NullPointerException
at test.main(test.java:17)


Schätze das hat damit zu tun, das test folder.zip auch im Jar liegt.

Klasse test.java:

Java:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class test {
    public static void main(String[]args) throws IOException {
    File jarFile = new File("/Test folder.zip");
    File destDir = new File(
            "C:\\Users\\irgendjemand\\Documents\\Test folder");
        java.util.jar.JarFile jar = null;
        try {
            jar = new java.util.jar.JarFile(jarFile);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    java.util.Enumeration enumEntries = jar.entries();
    while (enumEntries.hasMoreElements()) {
        java.util.jar.JarEntry file = (java.util.jar.JarEntry) enumEntries.nextElement();
        java.io.File f = new java.io.File(destDir + java.io.File.separator + file.getName());
        if (file.isDirectory()) { // if its a directory, create it
            f.mkdir();
            continue;
        }
        java.io.InputStream is = null;
        try {
            is = jar.getInputStream(file);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } // get the input stream
        java.io.FileOutputStream fos = new java.io.FileOutputStream(f);
        while (is.available() > 0) {  // write contents of 'is' to 'fos'
            fos.write(is.read());
        }
        fos.close();
        is.close();
    }
    jar.close();
}
}
Oder hab ich hier was falsch verstanden
 
Zuletzt bearbeitet:
mrBrown

mrBrown

Wo hast du denn den Code ausgegraben?

Nur um die Anforderungen richtig zu verstehen: du hast in der Jar eine .exe liegen und möchtest die an irgendeinem, vom Nutzer auswählbaren Pfad speichern?
 
B

BestGoalkeeper

Gebt ihm doch die Lösung dann ist Ruh:
Java:
	void extract(String filename) throws IOException {
		InputStream link = (getClass().getResourceAsStream("/path/resources/" + filename));
		Files.copy(link, new File(filename).getAbsoluteFile().toPath());
	}

Btw. So etwas kann schnell auch mal von einem Virenscanner als verdächtiges Verhalten eingestuft werden...
 
VPChief

VPChief

(Das System kann den angegebenen Pfad nicht finden)

das ist immer das aus der .jar

deshalb habe ich das hier ja erstellt
 
J

JustNobody

Also mit dem getResourceAsStream kannst du eine Datei aus dem Classpath und somit aus dem jar File öffnen.

Du musst aber natürlich den Pfad und Namen richtig angeben und dabei auch auf Gross-/Kleinschreibung achten.
 
J

JustNobody

Dann zeig den Inhalt der jar Datei komplett und den genauen Code, denn du versuchst.

Aber dmes muss der Pfad in der jar Datei und der Dateiname genau sichtbar sein.
 
VPChief

VPChief

Code:
Java:
package forumjar;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.channels.FileChannel;

import javax.swing.JFileChooser;

public class Test {
    public static void main(String[]args) throws IOException {
        


JFileChooser fileChooser = new JFileChooser();
File inF = new  File("/Test folder/Test File.exe");       
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnValue = fileChooser.showOpenDialog(null);
        if (returnValue == JFileChooser.APPROVE_OPTION) {
          File selectedFile = fileChooser.getSelectedFile();
          PrintWriter writer = null;
          try {
       File targetFile = new File(selectedFile, "Test File.exe");
        System.out.println(targetFile);
            writer = new PrintWriter(targetFile);
            File outF = new  File("" + targetFile);
            try {
                copyFile(inF, outF);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          } catch (IOException ae) {
            ae.printStackTrace();
          }  finally {
            if (writer != null) {
              writer.flush();
              writer.close();
            }
          }
        }
        }
    private static void copyFile(File inF, File outF) throws IOException {
        FileChannel inChannel = null;
        FileChannel outChannel = null;
        try {
            inChannel = new FileInputStream(inF).getChannel();
            outChannel = new FileOutputStream(outF).getChannel();
            inChannel.transferTo(0, inChannel.size(), outChannel);
        } catch (IOException e) {
            throw e;
        } finally {
            try {
                if (inChannel != null)
                    inChannel.close();
                if (outChannel != null)
                    outChannel.close();
            } catch (IOException e) {}
        }
    
    

        
    
}
    
    

}
 
J

JustNobody

Da hast Du doch nichts von dem umgesetzt, was Dir geschrieben wurde.

Mit File greifst Du auf Dateien im Filesystem zu. Aber das willst Du doch nicht, denn Deine Datei ist innerhalb des jar Files.

Daher statt dessen der Zugriff über getClass().getResourceAsStream.
 
J

JustNobody

Das ist keine Fehlerbeschreibung. Wie es gehen würde, ist schon in #4 im Link zu finden (inkl. einem Codebeispiel wie in #9. Und der Link findet sich in #9 erneut). Versuche es so und wenn es nicht geht: Zeig den Code mit getResourceAsStream und sag, was genau nicht geht. Dann könnte man Dir weiter helfen.
 
VPChief

VPChief

Das zu kopierende File inF habe ich jetzt durch
InputStream inF = (Test.class.getClass().getResourceAsStream("/Test folder/Test File.exe"));
ersetzt und in der copy methode File inFdurch Input Stream inF,Sonst ist alles gleich
Das ist keine Fehlerbeschreibung
befindet sich doch schon in #10 und #12 : Das System kann den angegebenen Pfad nicht finden bei diesen zeilen:

inChannel = new FileInputStream("" + inF).getChannel();
copyFile(inF, outF);
 
Zuletzt bearbeitet:
Thema: 

Gibt es eine möglichkeit Dateien aus der jar datei zu kopieren?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben