Como ler o arquivo do caminho relativo no projeto Java? java.io.File não pode encontrar o caminho especificado

113

Tenho um projeto com 2 pacotes:

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

No pacote (2) eu tenho um arquivo de texto ListStopWords.txt, no pacote (1) eu tenho uma aula FileLoadder. Aqui está o código em FileLoader:

File file = new File("properties\\files\\ListStopWords.txt");

Mas tem este erro:

The system cannot find the path specified

Você pode dar uma solução para consertar isso? Obrigado.

tiendv
fonte
12
Seus dois exemplos de pacote são iguais. Não quer dizer properties.filespara 2?
BalusC,

Respostas:

172

Se já estiver no caminho de classe, basta obtê-lo do caminho de classe em vez do sistema de arquivos do disco. Não mexa com caminhos relativos em java.io.File. Eles dependem do diretório de trabalho atual sobre o qual você não tem nenhum controle de dentro do código Java.

Supondo que ListStopWords.txtesteja no mesmo pacote de sua FileLoaderclasse, faça:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

Ou se tudo o que você está procurando é na verdade um InputStreamdeles:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

Isso certamente é preferido em vez de criar um new File()porque urlpode não representar necessariamente um caminho do sistema de arquivos do disco, mas também pode representar o caminho do sistema de arquivos virtual (o que pode acontecer quando o JAR é expandido na memória em vez de em uma pasta temporária no sistema de arquivos do disco) ou mesmo um caminho de rede que não é digerido por definição pelo Fileconstrutor.

Se o arquivo for - como o nome do pacote sugere - é na verdade um arquivo de propriedades completo (contendo key=valuelinhas) com apenas a extensão "errada", então você pode alimentar InputStreamimediatamente o load()método.

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

Nota: quando você está tentando acessá-lo de dentro do staticcontexto, use FileLoader.class(ou qualquer outra coisa YourClass.class) em vez dos getClass()exemplos acima.

BalusC
fonte
O FileLoader foi removido do java? Estou tentando fazer isso de um contexto estático (java 6) e não consigo encontrar nenhuma maneira de importá-lo e ele continua me dizendo que não pode resolver para um tipo. Estranhamente, ele se completou automaticamente conforme eu o digitava, mas então começou a me dar um erro.
turbo
2
oh, deveria ser ClassLoader.class.
turbo
4
@turbo: FileLoaderé a classe personalizada do OP. Deve ser exatamente aquela classe em que você está tentando obter o recurso. Assim, então NameOfYourCurrentClass.class.getResourceAsStream(...). O ClassLoader.classfalhará se a ClassLoaderclasse estiver sendo carregada por um carregador de classe diferente, o que pode acontecer em um aplicativo "corporativo" com uma hierarquia de vários carregadores de classe (como um aplicativo da web Java EE).
BalusC de
Ohh, entendo. Não entendi que era dependente. Obrigado por esclarecer isso!
turbo
10
Alguma sugestão para se o arquivo não estiver no mesmo pacote? No meu caso, estou tentando abrir um arquivo que está localizado em um pacote de teste.
Robin Newhouse,
44

A linha a seguir pode ser usada se quisermos especificar o caminho relativo do arquivo.

File file = new File("./properties/files/ListStopWords.txt");  
santhosh
fonte
3
posso saber por que 3 barras entre o caminho.
MSNaidu
Erro:> Caractere de escape ilegal no literal da string.
IgorGanapolsky
Como converter isso em um InputStream?
IgorGanapolsky
1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
Cameron Hudson
42

O caminho relativo funciona em java usando o. operador.

  • . significa a mesma pasta do contexto em execução no momento.
  • .. significa a pasta pai do contexto em execução no momento.

Portanto, a questão é como saber o caminho para onde o java está procurando atualmente?

faça uma pequena experiência

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

Observe a saída, você conhecerá o diretório atual onde o java está procurando. A partir daí, simplesmente use o operador ./ para localizar seu arquivo.

por exemplo, se a saída for

G: \ JAVA8Ws \ MyProject \ content.

e seu arquivo está presente na pasta MyProject basta usar

File resourceFile = new File("../myFile.txt");

Espero que isto ajude

Samrat
fonte
depois de horas pesquisando, esta resposta me forneceu a solução
erdostamasa
8
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}
polia sem fricção
fonte
1
@IgorGanapolsky é o nome da classe. Você pode se referir a .classliteral apenas fornecendo o nome completo de sua classe.
Tomasz Mularczyk
Eu acho que pretende ser FileLoader.
jamesdeath123
6

experimentar .\properties\files\ListStopWords.txt

erro.
fonte
5

Eu poderia ter comentado, mas tenho menos reputação para isso. A resposta de Samrat fez o trabalho para mim. É melhor ver o caminho do diretório atual por meio do código a seguir.

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

Eu simplesmente usei isso para corrigir um problema que estava enfrentando em meu projeto. Certifique-se de usar ./ ​​para voltar ao diretório pai do diretório atual.

    ./test/conf/appProperties/keystore 
dezible
fonte
Estou executando meu código por meio do tomcat e, portanto, o diretório atual não é a pasta do projeto - como defino o caminho relativo para a raiz do projeto? Atualmente estou usando o caminho de disco rígido: "C: \\ Usuários \\ usuário \\ Desktop \\ Repositórios \\ L1_WebShop \\ dblogs.log";
Tiago Redaelli
@TiagoRedaelli confira esta questão: stackoverflow.com/questions/12843217/…
dezible 09/10/19
4

Embora a resposta fornecida pelo BalusC funcione para este caso, ela será interrompida quando o caminho do arquivo contiver espaços porque em uma URL, eles estão sendo convertidos para% 20, que não é um nome de arquivo válido. Se você construir o objeto File usando um URI em vez de uma String, os espaços em branco serão tratados corretamente:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());
Mark Krijgsman
fonte
2

Eu queria analisar 'command.json' dentro de src / main // js / Simulator.java. Para isso copiei o arquivo json na pasta src e dei o caminho absoluto assim:

Object obj  = parser.parse(new FileReader("./src/command.json"));
sver
fonte
2

insira a descrição da imagem aqui

Supondo que você queira ler do resourcesdiretório na FileSystemclasse.

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);

System.out.println(Files.readString(path));

Nota: a liderança .não é necessária.

R Sun
fonte
1

Para mim, na verdade, o problema é o caminho de classe do objeto File <project folder path> or ./src, então o uso File file = new File("./src/xxx.txt");resolveu meu problema

J.Luan
fonte
0

String basePath = new File ("myFile.txt"). GetAbsolutePath (); este caminho de base você pode usar como o caminho correto do seu arquivo

user13499397
fonte
-1

Se você está tentando chamar getClass()de um método estático ou bloco estático, você pode fazer o seguinte.

Você pode chamar getClass()o Propertiesobjeto que está carregando.

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}
arun_kk
fonte
Simplesmente faltando uma cotação de fechamento.
jamesdeath123
-1

Se o arquivo de texto não estiver sendo lido, tente usar um caminho absoluto mais próximo (se desejar, pode usar o caminho absoluto completo) como este:

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

suponha que o caminho absoluto seja:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
KR N
fonte