2011-01-04 6 views
4

Ich brauche ein File-Objekt aus einem Dateipfad zu einem Bild zu erstellen, die nach dem Erstellen einer JAR-Datei in einer JAR-Datei enthalten ist. Wenn versucht mit:von einer Ressource Pfad zu einem Bild in einer JAR-Datei

URL url = getClass().getResource("/resources/images/image.jpg"); 
File imageFile = new File(url.toURI()); 

aber es funktioniert nicht. Kennt jemand einen anderen Weg, es zu tun?

Antwort

2

der Regel können Sie nicht direkt bekommen java.io.File Objekt, da es für einen Eintrag in einem komprimierten Archiv keine physische Datei. Entweder Sie leben mit einem Strom (das ist am besten am meisten in den Fällen, da jede gute API kann mit Streams arbeiten) oder Sie können eine temporäre Datei erstellen:

URL imageResource = getClass().getResource("image.gif"); 
    File imageFile = File.createTempFile(
      FilenameUtils.getBaseName(imageResource.getFile()), 
      FilenameUtils.getExtension(imageResource.getFile())); 
    IOUtils.copy(imageResource.openStream(), 
      FileUtils.openOutputStream(imageFile)); 
+1

Was Paket ist FilenameUtils in? – MBU

+0

Apache Commons IO- – mhaller

+1

Beachten Sie, dass Code-Schnipsel nicht für entweder ein Applet oder eine App funktionieren würde. bereitgestellt mit JWS. Wenn die Ressource nicht bearbeitet werden muss (unwahrscheinlich mit einem Bild), ist die Erweiterung in eine temporäre Datei normalerweise nicht der richtige Weg. –

1

können Sie nicht ein File-Objekt zu einem Referenz in einem Archiv erstellen. Wenn Sie unbedingt ein File-Objekt benötigen, müssen Sie die Datei zuerst an einen temporären Speicherort extrahieren. Auf der anderen Seite nehmen die meisten guten APIs stattdessen auch einen Eingabestream, den Sie für eine Datei in einem Archiv erhalten können.

+1

“zu schließen, die meisten guten API wird auch anstelle eines Eingangsstroms nehmen, was Sie bekommen können eine Datei in ein Archiv. " Insbesondere können Sie verwenden 'getResourceAsStream' statt' getResource' – Powerlord

3

Das sollte funktionieren.

String imgName = "/resources/images/image.jpg"; 
InputStream in = getClass().getResourceAsStream(imgName); 
ImageIcon img = new ImageIcon(ImageIO.read(in)); 
+2

Quick Fix: 'getResource' eine' URL' zurückgibt, 'getResourceAsStream' gibt ein' InputStream' – Powerlord

5

Um eine Datei auf Android von einer Ressource zu erstellen oder roh Datei, die ich dies tun:

try{ 
    InputStream inputStream = getResources().openRawResource(R.raw.some_file); 
    File tempFile = File.createTempFile("pre", "suf"); 
    copyFile(inputStream, new FileOutputStream(tempFile)); 

    // Now some_file is tempFile .. do what you like 
} catch (IOException e) { 
    throw new RuntimeException("Can't create temp file ", e); 
} 

private void copyFile(InputStream in, OutputStream out) throws IOException { 
    byte[] buffer = new byte[1024]; 
    int read; 
    while((read = in.read(buffer)) != -1){ 
     out.write(buffer, 0, read); 
    } 
} 
  • vergessen Sie nicht, Ihre Streams usw. auf der anderen Seite
+0

Dies ist DIE Antwort auf alle Antworten zu diesem Thema! – Jesse

Verwandte Themen