2009-10-12 11 views
8

Si tengo un recurso en un classpath, puedo cargarlo como stream fine, e incluso hay una representación de URL del mismo. Desafortunadamente, algunas implementaciones de la URL no implementan lastModified correctamente.Dado un recurso classpath, ¿hay alguna forma de obtener el objeto java.io.File que lo tiene/lo contiene?

Lo que me gustaría es tomar un camino a algo en el classpath, y luego resolverlo en un archivo que está en el disco - si está en un jar, entonces un archivo que apunta al jar está bien. Luego puedo obtener el lastModified del objeto File en lugar de la URL, que será más útil.

Respuesta

12

A grandes rasgos:

URL url = this.getClass().getResource(myResource); 
    String fileName; 
    if (url.getProtocol().equals("file")) { 
     fileName = url.getFile();   
    } else if (url.getProtocol().equals("jar")) { 
     JarURLConnection jarUrl = (JarURLConnection) url.openConnection(); 
     fileName = jarUrl.getJarFile().getName();    
    } else { 
     throw new IllegalArgumentException("Not a file"); 
    } 
    File file = new File(fileName); 
    long lastModified = file.lastModified(); 

debe hacer lo que quiere. Necesitarás atrapar IOException.

-1

No. Esto no puede hacerse generalmente porque la URL puede representar recursos que no están asociados con un archivo. Por ejemplo, puede ser HTTP, FTP o JNDI, etc.

Puede verificar el protocolo y crear el archivo usted mismo si el protocolo está basado en archivos, como "file: // path", "jar: // path" ! ... ".

Cuestiones relacionadas