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.