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.


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.


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");  

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


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();
}

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


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 

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());

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"));

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.


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


0

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


-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);
}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.