Problema sysLoader.getResource () em java

Eu estou seguindo as linhas de código.

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

Está dando um problema estranho. Se eu executar isso a partir de um caminho onde não há espaço no caminho (nomes de pastas), então ele está funcionando bem. Mas se o caminho contiver algum espaço (linha “c: \ New Foler …”) então não está funcionando.

Como resolver isso?

EDIT: Em mais detalhes – Eu inspecionei o object sysloader.

sysloader -> UCP -> caminho

Está tendo um caminho com caractere% 20 em vez de espaço

E, portanto, todas as URLs são nulas.

Como resolver isso?

Isso é conhecido pela Sun / Oracle, o conselho deles é usar objects URI que removerão os caracteres% 20:

Em vez de fazer isso:

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

você pode forçar a decodificação de qualquer caractere% -escaped convertendo primeiro o URL em um URI e, em seguida, usar o componente path do URI como o nome do arquivo:

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

Use o método URLDecoder.decode() para replace %20 caracteres por espaços.

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

Por favor, tenha em mente que quando o recurso está localizado no arquivo jar você tem que lidar com isso de maneira diferente. Veja aqui, por exemplo: Como acessar resources no jar, onde ele pode estar presente em múltiplos jar

Para obter a URL do arquivo da string, quando o caminho contiver espaços, isso é o que funcionou para mim:

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

De acordo com Javadocs, file.toURL() está obsoleto :

Este método não escapa automaticamente caracteres que são ilegais em URLs. Recomenda-se que o novo código converta um nome de caminho abstrato em um URL primeiro convertendo-o em um URI, por meio do método toURI e, em seguida, convertendo o URI em um URL por meio do método URI.toURL.

Daqui utilizado file.toURI().toURL() .

Para o Java 7+, esta abordagem pode ser tomada em vez disso:

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

Nota : Se o caminho começar com a / , é considerado absoluto, mais tomado como um caminho relativo.