2010-07-16 11 views
21

Tengo las siguientes líneas de código.problema sysLoader.getResource() en java

sysLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader(); 
url = sysLoader.getResource("tempFile.txt"); 

Se está produciendo un problema raro. Si ejecuto esto desde una ruta en la que no hay espacio en la ruta (nombres de carpetas), se está ejecutando correctamente. Pero si la ruta contiene espacios (línea "c: \ New Foler ..."), entonces no está funcionando.

¿Cómo resolver esto?

EDITAR: Más detalladamente, inspeccioné el objeto sysloader.

sysloader -> UCP -> ruta

está teniendo un camino con carácter% 20 en lugar del espacio

y por lo tanto todas las direcciones URL son nulos.

¿Cómo resolver esto?

+0

Definir "no funciona". ¿Devuelve 'null'? ¿O la 'URL' devuelta no funciona en algún contexto? –

+0

Devuelve NULL en la URL – Vishal

Respuesta

31

Esto es conocido por Sun/Oracle, su consejo es utilizar objetos URI que eliminará el% 20 caracteres:

lugar de hacer esto:

FileInputStream fis = new FileInputStream(url.getFile()); 

se puede obligar a ningún % personajes -escape a ser decodificados convirtiendo en primer lugar la URL a un URI, y luego usar el componente de trazado de la URI como nombre de archivo:

URI uri = new URI(url.toString()); 
FileInputStream fis = new FileInputStream(uri.getPath()); 
+1

Aquí está el correspondiente pero el informe marcado como "No se solucionará": http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4466485. Este error/característica todavía existe en Java 1.7. – asmaier

+5

Una versión más corta sin convertir explícitamente a cadena y volver a URI sería: 'URI uri = url.toURI();' 'FileInputStream fis = new FileInputStream (uri.getPath());' – Thomas

7

Utilice el método URLDecoder.decode() para reemplazar %20 caracteres por espacios.

String path = URLDecoder.decode(url.getPath(), "UTF-8");

Por favor, tenga también en cuenta que cuando los recursos se encuentra en archivo jar que tiene que manejar la situación de manera diferente. Véalo, por ej. aquí: How to access resources in jar where it can be present in multiple jar

0

para obtener la URL del archivo de cadena, cuando la ruta contiene espacios, esto es lo que funcionó para mí:

File file = new File("/Users/work space/tempFile.txt"); 
URL url = file.toURI().toURL(); 

Según Javadocs, file.toURL() es deprecated:

Este método no se escapa de forma automática caracteres que son ilegales en las URL Se recomienda que el nuevo código convierta una ruta de acceso abstracta en una URL convirtiéndola primero en una URI, mediante el método toURI, y luego convirtiendo la URI en una URL mediante el método URI.toURL.

Por lo tanto, se utiliza file.toURI().toURL().

Para 7+ Java, este es el enfoque se puede tomar en su lugar:

URL url = Paths.get("/Users/work space/tempFile.txt").toURI().toURL()); 

Nota: Si la ruta se inicia con una / se considera absoluta otra tomada como una ruta relativa.