Como o caminho onde está o arquivo de configuração pode variar de acordo se você está em modo projeto (debug) modo release (executável), então, testo as possibilidades de onde pode realmente estar o arquivo.
Mas deixo isso por conta de uma função estática que resolver o caminho correto e me retorna o caminho absoluto do arquivo.
Exemplo:
public static String INI_ABSOLUTE_PATH() {
File f = null;
String test = null;
try {
test = "/src/properties/SERVICO.INI";
test = Function.getAppPath() + test;
f = new File(test);
if (f.exists()) {
return test;
}
test = "/properties/SERVICO.INI";
test = Function.getAppPath() + test;
f = new File(test);
if (f.exists()) {
return test;
}
test = "/../properties/SERVICO.INI";
test = Function.getAppPath() + test;
f = new File(test);
if (f.exists()) {
return test;
}
return (Function.getAppPath() + "/properties/SERVICO.INI");
} catch (IOException e) {
System.err.println(e);
}
return null;
}
[quote=williamps]test = "/src/properties/SERVICO.INI";
test = Function.getAppPath() + test; [/quote]
O mistério continua, pois a dúvida dele é sobre a mágica do Function.getAppPath().
A resposta mais simples é: não é possível obter o caminho da aplicação em Java.
GetClass().GetRessource("/banco/Instalador.txt")
Se está dentro do projeto (e consequentemente no classpath da aplicação) isso deveria funcionar, precisa investigar melhor o que está acontecendo!
Mas isso não é o path da aplicação, é o path onde você está.
Algumas pessoas costumam confundir essas duas coisas, mas se pode fazer uma experiência simples para ver a diferença:
Criar um arquivo Caminho.java, contendo a seguinte classe:
import java.io.File;
class Caminho {
public static void main(String[] args) throws java.io.IOException {
System.out.println("Path: " + new File("").getCanonicalPath());
}
}
Compilar essa classe pelo comando javac, gerando um arquivo Caminho.class
Alguém desavisado pararia aqui, concluindo que aquela linha de código realmente pega o caminho da aplicação. Mas experimente mudar o diretório e chamar a mesma classe novamente:
E eis o que acontece realmente: o construtor new File("") pega o diretório atual, independente de onde está seu aplicativo, as classes ou arquivos dependentes. Por coincidência, você pode iniciar o programa a partir de um diretório especificado e então vai dar certo.
Isso é uma solução?
Sem dúvida é uma opção a ser considerada. Mas como qualquer solução, para adotá-la é preciso se saber o que está fazendo e conhecer os riscos envolvidos. Se o desenvolvedor não sabe a idéia por trás da solução que adotou (está usando apenas porque testou em uma determinada situação e funcionou) ele pode vir a ter problemas que não faz idéia de onde procurar.
A programação por coincidência é sempre uma coisa muito perigosa!