2012-12-30 12 views
32

Ho seguito il metodo di caricamento del file di risorse utilizzando getClass.getResource(path). Il frammento di codice è qui:Caricamento di file da getClass(). GetResource()

String url = "Test.properties"; 

System.out.println("Before printing paths.."); 
System.out.println("Path2: "+ getClass().getResource(url).getPath()); 

FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI())); 
i_propConfig.load(inputStream); 
inputStream.close(); 

Ho configurato in Eclipse con la gerarchia (Sotto fonte c'è una cartella chiamata SwingDemo In SwingDemo c'è il mio file java così come il file di risorse.) ...

  1. src
    • SwingDemo
      1. CustomDialog.java
      2. Test.properties

Quando sto facendo funzionare questo su Eclipse tutto sta funzionando benissimo. Ma non appena si tenta di eseguire le applicazioni da linea di cmd un'eccezione di puntatore nullo è in corso ..

gerarchia distribuzione

riga di comando è la seguente:

Cartella: D:\Work\Java Progrms\SwingDemo

Gerarchia:

  1. SwingDemo
    • CustomDialog.java
    • Test.proprietà

Prima di tutto ho compilato questo file all'interno della cartella SwingDemo da linea di comando (javac CustomDialog.java). Poi mi sposto un passo indietro nella cartella programmi Java (come ho già detto il pacchetto all'interno .java classe) ed eseguire le applicazioni utilizzando il famoso

java SwingDemo.CustomDialog 

ho usato per seguire i passi simili quando ho usato new FileInputStream ("percorso ") in precedenza. Dopo aver fatto questo modo ottengo eccezione puntatore nullo ..

Penso che getClass().getResource(url) non può caricare il file da una directory specifica. Ecco perché ho inserito la risorsa nella stessa directory di quella del mio file java. Funzionava bene in Eclipse. Ma perché questo sta dando errore quando corro da Command Line.

risposta

61

getClass().getResource() utilizza il programma di caricamento classi per caricare la risorsa. Ciò significa che la risorsa deve trovarsi nel classpath da caricare.

Quando farlo con Eclipse, tutto quello che hai messo nella cartella di origine è "compilato" per Eclipse:

  • file .java vengono compilati in.file di classe che vanno nella directory bin (per impostazione predefinita)
  • altri file vengono copiati nella directory bin (rispettando il pacchetto/cartella hirearchy)

Quando si lancia il programma con Eclipse, la directory bin è quindi in il classpath, e dal momento che contiene il file Test.properties, questo file può essere caricato dal caricatore di classe, utilizzando getResource() o getResourceAsStream().

Se non funziona dalla riga di comando, è perché il file non è nel classpath.

notare che non si dovrebbe fare

FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI())); 

per caricare una risorsa. Perché ciò può funzionare solo se il file viene caricato dal file system. Se impacchettate la vostra app in un file jar o se caricate le classi su una rete, non funzionerà. Per ottenere un InputStream, basta usare

getClass().getResourceAsStream("Test.properties") 

E, infine, come la documentazione indica,

Foo.class.getResourceAsStream("Test.properties") 

caricherà un file Test.properties situato nello stesso pacchetto della classe Foo.

Foo.class.getResourceAsStream("/com/foo/bar/Test.properties") 

caricherà un file Test.properties situato nel pacchetto com.foo.bar.

+2

Questo mi ha aiutato: "Se il pacchetto la tua app in un file jar o se carichi le classi su una rete, non funzionerà. " -> Devi invece ottenere un InputStream dal file. –

6

Il modo migliore per accedere ai file dalla cartella delle risorse all'interno di un jar è utilizzare InputStream tramite getResourceAsStream. Se hai ancora bisogno di una risorsa come istanza di file è possibile copiare la risorsa come un flusso in un file temporaneo (il file temporaneo verrà cancellato quando le uscite JVM):

public static File getResourceAsFile(String resourcePath) { 
    try { 
     InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath); 
     if (in == null) { 
      return null; 
     } 

     File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp"); 
     tempFile.deleteOnExit(); 

     try (FileOutputStream out = new FileOutputStream(tempFile)) { 
      //copy stream 
      byte[] buffer = new byte[1024]; 
      int bytesRead; 
      while ((bytesRead = in.read(buffer)) != -1) { 
       out.write(buffer, 0, bytesRead); 
      } 
     } 
     return tempFile; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

Risposta molto utile. Vorrei poter cambiare più volte: D. Penso che sarà in grado di lavorare anche con questa linea di codice InputStream in = getClass(). GetResourceAsStream (resourcePath); – xXxpRoGrAmmErxXx

Problemi correlati