As java.io.File
consorts e atuam no sistema de arquivos do disco local. A causa raiz do seu problema é que os caminhos relativosjava.io
são dependentes do diretório de trabalho atual. Ou seja, o diretório a partir do qual a JVM (no seu caso: a do servidor da web) é iniciada. Por exemplo, isso pode ser C:\Tomcat\bin
ou algo completamente diferente, mas, portanto, não C:\Tomcat\webapps\contextname
ou o que você espera que seja. Em um projeto normal do Eclipse, isso seria C:\Eclipse\workspace\projectname
. Você pode aprender sobre o diretório de trabalho atual da seguinte maneira:
System.out.println(new File(".").getAbsolutePath());
No entanto, o diretório de trabalho não é de forma programável controlável. Você realmente deve preferir usar caminhos absolutos na File
API em vez de caminhos relativos. Por exemplo C:\full\path\to\file.ext
.
Você não deseja codificar ou adivinhar o caminho absoluto nos aplicativos Java (web). Isso é apenas um problema de portabilidade (ou seja, é executado no sistema X, mas não no sistema Y). A prática normal é colocar esse tipo de recursos no caminho de classe ou adicionar seu caminho completo ao caminho de classe (em um IDE como o Eclipse, essa é a src
pasta e o "caminho de construção", respectivamente). Desta forma, você pode pegá-los com a ajuda do ClassLoader
by ClassLoader#getResource()
ou ClassLoader#getResourceAsStream()
. Ele é capaz de localizar arquivos relativos à "raiz" do caminho de classe, como você descobriu por coincidência. Nos aplicativos da web (ou em qualquer outro aplicativo que use vários carregadores de classe), é recomendável usar o valor ClassLoader
retornado Thread.currentThread().getContextClassLoader()
para que você possa procurar "fora" do contexto do aplicativo da web.
Outra alternativa nos aplicativos da web é a ServletContext#getResource()
e sua contraparte ServletContext#getResourceAsStream()
. É capaz de acessar arquivos localizados na web
pasta pública do projeto webapp, incluindo a /WEB-INF
pasta. O ServletContext
está disponível em servlets pelo getServletContext()
método herdado , você pode chamá-lo como está.
Veja também:
getResourceAsStream
é a maneira certa de fazer isso para aplicativos da web (como você já aprendeu).O motivo é que a leitura do sistema de arquivos não funcionará se você empacotar seu aplicativo da web em um WAR. Essa é a maneira correta de empacotar um aplicativo da web. É portátil dessa maneira, porque você não depende de um caminho absoluto de arquivo ou do local em que o servidor de aplicativos está instalado.
fonte
FileInputStream carregará o caminho do arquivo que você passa para o construtor como relativo do diretório de trabalho do processo Java. Geralmente em um contêiner da web, isso é algo como a
bin
pasta.getResourceAsStream()
carregará um caminho de arquivo relativo do caminho de classe do seu aplicativo .fonte
A
FileInputStream
classe trabalha diretamente com o sistema de arquivos subjacente. Se o arquivo em questão não estiver fisicamente presente lá, ele não será aberto. OgetResourceAsStream()
método funciona de maneira diferente. Ele tenta localizar e carregar o recurso usando oClassLoader
da classe em que é chamado. Isso permite encontrar, por exemplo, recursos incorporados aosjar
arquivos.fonte
jar
formato do arquivo e suas implicações. E em Java, o apropriadoClassLoader
pode ter esse conhecimento, enquanto um claroFileInputStream
certamente não tem.classname.getResourceAsStream () carrega um arquivo através do carregador de classe de classname. Se a classe vier de um arquivo jar, é daí que o recurso será carregado.
FileInputStream é usado para ler um arquivo do sistema de arquivos.
fonte
Estou aqui separando os usos, marcando-os como Leitura de arquivo (java.io) e Leitura de recurso (ClassLoader.getResourceAsStream ()).
Leitura de arquivo - 1. Funciona no sistema de arquivos local. 2. Tenta localizar o arquivo solicitado do diretório ativado pela JVM atual como raiz 3. Idealmente bom ao usar arquivos para processamento em um local predeterminado, como / dev / files ou C: \ Data.
Leitura de recurso - 1. Funciona no caminho da classe 2. Tenta localizar o arquivo / recurso no caminho de classe atual ou pai do carregador de classes. 3. Idealmente bom ao tentar carregar arquivos de arquivos compactados como war ou jar.
fonte