[RESOLVIDO]Como sempre achar o txt indendente do pc que rode a aplicação?

Olá a todos
Estou na parte pratica do meu TCC, e meu programa antes de iniciar precisa ler um arquivo txt.
mais esse é o eu problema:

BufferedReader leitor = new BufferedReader(new FileReader(new File("/banco/Instalador.txt")));

esse arquivo txt está dentro do meu projeto e deverá ser localizado sempre, independente do pc que programa esteja rodando.

gostaria de algo semelhante ao

new File(GetClass().GerRessource("/banco/Instalador.txt"); //para localizar sempre o arquivo txt independente do pc que esteja.

mais esses métodos só funcionam quando faço referencia a imagem.
alguém poderia me ajudar?

Obrigado desde já.

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;

	}

wiliamps

[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.
:frowning:


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!

A resposta está errada. Você consegue saber sim o path da aplicação.

Problema é que esqueci de passar minha função getAppPath():

	public static String getAppPath() throws IOException {

		File x = new File("");
		return x.getCanonicalPath();

	}

wiliamps

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

C:\temp\teste_caminho>javac Caminho.java C:\temp\teste_caminho>dir 11/16/2012 01:14 PM 698 Caminho.class 11/16/2012 01:08 PM 186 Caminho.java 2 File(s) 884 bytes 2 Dir(s) 160,674,414,592 bytes free C:\temp\teste_caminho>

  • Coloque o diretório onde está a classe no CLASSPATH, para que ela sempre possa ser encontrada:
C:\temp\teste_caminho>set CLASSPATH=C:\temp\teste_caminho
  • Finalmente invoque a JVM para executar seu programa
C:\temp\teste_caminho>java Caminho
Path: C:\temp\teste_caminho

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:

C:\temp\teste_caminho>cd C:\Users\rodrigo\Documents C:\Users\rodrigo\Documents>java Caminho Path: C:\Users\rodrigo\Documents

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!

Muito obrigado a todos que postaram.
foi de muita ajuda e ja consegui elaborar o que queria.
obrigado mesmo.