Come leggere il file dal percorso relativo nel progetto Java? java.io.File non riesce a trovare il percorso specificato


113

Ho un progetto con 2 pacchetti:

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

Nel pacchetto (2) ho un file di testo ListStopWords.txt, nel pacchetto (1) ho una classe FileLoadder. Ecco il codice in FileLoader:

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

Ma hai questo errore:

The system cannot find the path specified

Puoi dare una soluzione per risolverlo? Grazie.


12
I tuoi due esempi di pacchetto sono gli stessi. Non intendi properties.filesper 2?
BalusC

Risposte:


173

Se è già nel classpath, ottenerlo semplicemente dal classpath anziché dal file system del disco. Non giocherellare con percorsi relativi in java.io.File. Dipendono dalla directory di lavoro corrente su cui non si ha alcun controllo dall'interno del codice Java.

Supponendo che ListStopWords.txtsia nello stesso pacchetto della tua FileLoaderclasse, allora fai:

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

O se tutto ciò che alla fine stai cercando è in realtà un InputStreamdi esso:

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

Questo è certamente preferito rispetto alla creazione di un new File()perché urlpotrebbe non rappresentare necessariamente un percorso del file system del disco, ma potrebbe anche rappresentare il percorso del file system virtuale (che può accadere quando il JAR viene espanso in memoria invece che in una cartella temporanea sul file system del disco) o anche un percorso di rete che non sono entrambi digeribili per definizione dal Filecostruttore.

Se il file è -come suggerisce il nome del pacchetto- è in realtà un file delle proprietà completo (contenente key=valuerighe) con solo l'estensione "sbagliata", allora potresti inviare InputStreamimmediatamente il file al load()metodo.

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

Nota: quando stai cercando di accedervi dall'interno del staticcontesto, usa FileLoader.class(o qualsiasi altra cosa YourClass.class) invece degli getClass()esempi precedenti.


FileLoader è stato rimosso da java? Sto provando a farlo da un contesto statico (java 6) e non riesco a trovare alcun modo per importarlo e continua a dirmi che non può risolversi in un tipo. Stranamente, si è completato automaticamente mentre lo digitavo, ma poi ha continuato a darmi un errore.
turbo

2
oh, dovrebbe essere ClassLoader.class.
turbo

4
@ turbo: FileLoaderè la classe personalizzata di OP. Dovrebbe essere esattamente quella classe in cui stai tentando di ottenere la risorsa. Quindi, così NameOfYourCurrentClass.class.getResourceAsStream(...). Il programma ClassLoader.classfallirà se la ClassLoaderclasse viene caricata da un diverso classloader, cosa che può accadere in un'applicazione "enterprise" con una gerarchia di più classloader (come un'applicazione web Java EE).
BalusC

Oh capisco. Non capivo che dipendesse. Grazie per aver chiarito tutto!
turbo

10
Qualche suggerimento per se il file non è nello stesso pacchetto? Nel mio caso sto cercando di aprire un file che si trova in un pacchetto di prova.
Robin Newhouse

44

La riga seguente può essere utilizzata se si desidera specificare il percorso relativo del file.

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

3
posso sapere perché 3 barre tra il percorso.
MSNaidu

Errore:> Carattere di escape non valido nella stringa letterale.
IgorGanapolsky

Come convertirlo in un InputStream?
IgorGanapolsky

1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
Cameron Hudson

42

Il percorso relativo funziona in java utilizzando l'estensione. operatore.

  • . significa la stessa cartella del contesto attualmente in esecuzione.
  • .. indica la cartella principale del contesto attualmente in esecuzione.

Quindi la domanda è: come fai a sapere il percorso in cui sta cercando java?

fare un piccolo esperimento

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

Osserva l'output, verrai a conoscenza della directory corrente in cui sta cercando java. Da lì, usa semplicemente l'operatore ./ per individuare il tuo file.

per esempio se l'output è

G: \ JAVA8Ws \ MyProject \ content.

e il tuo file è presente nella cartella MyProject usa semplicemente

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

Spero che questo ti aiuti


dopo ore di ricerca questa risposta mi ha fornito la soluzione
erdostamasa il

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 è il nome di Class. Puoi fare riferimento al .classletterale solo fornendo il nome completo della sua classe.
Tomasz Mularczyk

Penso che intenda essere FileLoader.
jamesdeath123


5

Avrei potuto commentare ma ho meno rappresentante per questo. La risposta di Samrat ha fatto il lavoro per me. È meglio vedere il percorso della directory corrente tramite il codice seguente.

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

L'ho semplicemente usato per correggere un problema che stavo affrontando nel mio progetto. Assicurati di usare ./ per tornare alla directory principale della directory corrente.

    ./test/conf/appProperties/keystore 

Sto eseguendo il mio codice tramite Tomcat e quindi la directory corrente non è la cartella del progetto - Come definisco il percorso relativo alla radice del progetto? Attualmente sto utilizzando il percorso difficile: "C: \\ Users \\ user \\ Desktop \\ Repositories \\ L1_WebShop \\ dblogs.log";
Tiago Redaelli

@TiagoRedaelli controllare questo ques: stackoverflow.com/questions/12843217/...
dezible

4

Sebbene la risposta fornita da BalusC funzioni per questo caso, si interromperà quando il percorso del file contiene spazi perché in un URL questi vengono convertiti in% 20 che non è un nome di file valido. Se costruisci l'oggetto File utilizzando un URI anziché una stringa, gli spazi bianchi verranno gestiti correttamente:

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

2

Volevo analizzare 'command.json' all'interno di src / main // js / Simulator.java. Per questo ho copiato il file json nella cartella src e ho dato il percorso assoluto in questo modo:

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

2

inserisci qui la descrizione dell'immagine

Supponendo che tu voglia leggere dalla resourcesdirectory in 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: Leading .non è necessario.


1

Per me in realtà il problema è che il percorso della classe dell'oggetto File proviene da <project folder path> or ./src, quindi usa File file = new File("./src/xxx.txt");risolto il mio problema


0

String basePath = nuovo file ("myFile.txt"). GetAbsolutePath (); questo percorso di base è possibile utilizzare come percorso corretto del file


-1

Se stai provando a chiamare getClass()da un metodo statico o da un blocco statico, puoi procedere nel modo seguente.

Puoi chiamare getClass()l' Propertiesoggetto in cui stai caricando.

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}

Manca semplicemente una citazione di chiusura.
jamesdeath123

-1

Se il file di testo non viene letto, prova a utilizzare un percorso assoluto più vicino (se desideri puoi utilizzare il percorso assoluto completo) come questo:

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

supponiamo che il percorso assoluto sia:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.