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: