2010-10-02 9 views
83
angegeben finden

Ich habe ein Projekt mit zwei Paketen:Wie lese ich eine Datei vom relativen Pfad im Java-Projekt? java.io.File kann nicht der Weg

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

In-Paket (2) Ich habe eine Textdatei ListStopWords.txt, in Paket (1) Ich habe eine Klasse FileLoadder. Hier ist der Code in FileLoader:

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

Aber diesen Fehler haben:

The system cannot find the path specified 

Können Sie eine Lösung geben, um es zu beheben? Vielen Dank.

+5

Ihre beiden Paketbeispiele sind identisch. Meinst du nicht "properties.files" für "2"? – BalusC

Antwort

119

Wenn es bereits im Classpath, dann erhalten sie nur aus dem Classpath. Greife nicht mit relativen Pfaden in java.io.File. Sie sind abhängig vom aktuellen Arbeitsverzeichnis, über das Sie innerhalb des Java-Codes keinerlei Kontrolle haben.

Unter der Annahme, dass ListStopWords.txt im selben Paket wie FileLoader Klasse:

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

Oder wenn alles, was Sie sind, nachdem ein InputStream davon ist:

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

Wenn die Datei ist -wie die Paketname Hinweise- ist eigentlich ein vollwertiges properties file (mit key=value Zeilen) mit nur der "falschen" Erweiterung, dann könnten Sie es imm füttern direkt an die load() Methode.

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

Hinweis: wenn Sie versuchen, es von innen static Kontext zuzugreifen, dann FileLoader.class statt getClass() in obigen Beispielen verwenden.

+0

Wurde FileLoader aus Java entfernt? Ich versuche, dies aus einem statischen Kontext (Java 6) zu tun, und ich kann keine Möglichkeit finden, es zu importieren, und es sagt mir, dass es nicht zu einem Typ auflösen kann. Seltsamerweise wurde es automatisch vervollständigt, als ich es eintippte, aber dann gab er mir einen Fehler. – turbo

+1

oh, es sollte ClassLoader.class sein. – turbo

+4

@turbo: 'FileLoader' ist die eigene benutzerdefinierte Klasse von OP. Es sollte genau diese Klasse sein, in der Sie versuchen, die Ressource zu erhalten. Also, 'NameOfYourCurrentClass.class.getResourceAsStream (...)'. Die 'ClassLoader.class' wird fehlschlagen, wenn die' ClassLoader'-Klasse von einem anderen Klassenlader geladen wird, was in einer "Enterprise" -Anwendung mit einer Hierarchie von mehreren Klassenladern (wie einer Java-EE-Webanwendung) passieren kann. – BalusC

3

versuchen .\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

Was zum Teufel ist FileLoadder ??? –

+1

@IgorGanapolsky ist der Name der Klasse. Sie können auf das literal '.class' nur verweisen, indem Sie den vollständigen Namen seiner Klasse angeben. – Tomasz

+0

Ich denke, es soll FileLoader sein. – jamesdeath123

26

Die folgende Zeile kann verwendet werden, wenn der relative Pfad der Datei angegeben werden soll.

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

kann ich wissen, warum 3 Schrägstriche zwischen dem Pfad. –

+0

Fehler:> Ungültiges Escapezeichen im Zeichenfolgenliteral. –

+0

Wie konvertiert man dies in einen 'InputStream'? –

-1

Wenn Sie versuchen, getClass() von statische Methode oder statischer Block aufrufen dem Sie die folgende Art und Weise tun.

Sie können getClass() auf dem Properties Objekt aufrufen, in das Sie laden.

public static Properties pathProperties = null; 

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

Ein schließendes Zitat einfach verfehlen. – jamesdeath123

2

Während die Antwort zur Verfügung gestellt von BalusC für diesen Fall funktioniert, wird es brechen, wenn der Dateipfad Leerzeichen enthält, weil in einer URL, wird diese 20 bis% umgewandelt werden, die kein gültiger Dateiname ist. Wenn Sie das File-Objekt mit einem URI, anstatt einen String konstruieren, werden Leerzeichen korrekt behandelt werden:

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

Der relative Pfad in in Java arbeitet der Verwendung. Operator.

  • . bedeutet der gleiche Ordner wie der gerade laufende Kontext.
  • .. bedeutet den übergeordneten Ordner des aktuell ausgeführten Kontextes.

Also die Frage ist, woher weißt du den Pfad, wo das Java derzeit sucht?

tun ein kleines Experiment

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

den Ausgang beachten, werden Sie das aktuelle Verzeichnis wissen, wo Java sucht. Verwenden Sie einfach den Operator ./, um Ihre Datei zu suchen.

zum Beispiel, wenn der Ausgang

G:\JAVA8Ws\MyProject\content.

und Ihre Datei einfach

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

Hope this

hilft ist die Verwendung in dem Ordner MyProject vorhanden ist
-1

Wenn Textdatei nicht gelesen werden, Versuchen Sie es mit einem näheren absoluten Pfad (wenn Sie möchten Sie könnten absolute absolute Pfad verwenden,) wie folgt:

davon ausgehen, dass der absolute Pfad ist:

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

Ich wollte analysieren 'command.json' innerhalb src/main // js/Simulator.java. Dazu kopierte ich die JSON-Datei im src-Ordner und gab den absoluten Pfad wie folgt an:

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