2010-10-02 21 views
83

Ho un progetto con 2 pacchetti:Come leggere il file dal percorso relativo nel progetto Java? java.io.File non riesce a trovare il percorso specificato

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

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

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

ma hanno questo errore:

The system cannot find the path specified 

Si può dare una soluzione per risolvere il problema? Grazie.

+5

Entrambi gli esempi di pacchetto sono gli stessi. Non intendi 'properties.files' per' 2'? – BalusC

risposta

119

Se è già nel percorso di classe, poi basta ottenere da classpath. Non giocherellare con percorsi relativi in ​​java.io.File. Essi dipendono dalla directory di lavoro corrente su cui non si ha alcun controllo dall'interno del codice Java.

Supponendo che ListStopWords.txt è nello stesso pacchetto come FileLoader classe:

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

Oppure, se tutto quello che cercate è un InputStream di esso:

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

Se il file è -come la suggerimento del nome del pacchetto- è in realtà un fullworthy properties file (contenente key=value righe) con solo l'estensione "errata", quindi si potrebbe nutrirlo imm con il metodo load().

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

Nota: quando si sta cercando di accedervi dall'interno static contesto, quindi utilizzare FileLoader.class invece di getClass() negli esempi di cui sopra.

+0

FileLoader è stato rimosso da java? Sto cercando di farlo da un contesto statico (java 6) e non riesco a trovare alcun modo per importarlo e continua a dirmi che non può essere risolto con un tipo. Stranamente, è stato completato automaticamente durante la digitazione, ma poi ha proceduto a darmi un errore. – turbo

+1

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 'ClassLoader.class' fallirà se la classe' ClassLoader' viene caricata da un altro classloader, cosa che potrebbe accadere in un'applicazione "enterprise" con una gerarchia di più programmi di caricamento classi (come un'applicazione web Java EE). – BalusC

3

provare .\properties\files\ListStopWords.txt

4
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) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+1

Che diamine è FileLoadder ??? –

+1

@IgorGanapolsky è il nome di Class. Puoi fare riferimento al valore letterale '.class' solo fornendo il nome completo della sua classe. – Tomasz

+0

Penso che intenda essere FileLoader. – jamesdeath123

26

La seguente riga 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. –

+0

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

+0

Come convertire questo in un 'InputStream'? –

-1

Se si sta tentando di chiamare getClass() dal metodo statico o blocco statico la si può fare nel modo seguente.

È possibile chiamare getClass() sull'oggetto Properties in cui si sta caricando.

public static Properties pathProperties = null; 

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

Semplicemente manca una citazione di chiusura. – jamesdeath123

2

Mentre la risposta fornita da BalusC lavora per questo caso, si romperà quando il percorso del file contiene spazi, perché in un URL, questi vengono convertiti in% 20, che non è un nome di file valido. Se si costruisce l'oggetto di file tramite un URI, piuttosto che una stringa, gli spazi vuoti verranno trattati correttamente:

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

Il percorso relativo lavora in in Java utilizzando il. operatore.

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

Quindi la domanda è: come si conosce il percorso in cui si trova attualmente java?

fare un piccolo esperimento

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

Osservare l'output, si verrà a sapere la directory corrente in cui Java è alla ricerca. Da lì, usa semplicemente l'operatore ./ per trovare il tuo file.

ad esempio se l'uscita è

G:\JAVA8Ws\MyProject\content.

e il file è presente nel MyProject cartella è sufficiente utilizzare

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

Spero che questo aiuti

-1

Se non è in corso la lettura di file di testo, prova a utilizzare un percorso assoluto più vicino (se desideri che tu possa utilizzare il percorso assoluto completo,) come questo:

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

supporre che il percorso assoluto è:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt 
0

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

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