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.