2010-07-22 14 views
8

Ich versuche, ein Programm zu schreiben, um eine Textdatei über Argumente zu lesen, aber wenn ich es ausführe, sagt es immer, dass die Datei nicht gefunden werden kann, obwohl ich es in den gleichen Ordner wie main.java legte, das im läuft. Kennt jemand die Lösung für mein Problem oder eine bessere Art, eine Textdatei zu lesen?Wie übergebe ich eine Textdatei als Argument?

+0

Ich würde davon ausgehen, dass, wenn die Eingabe als ein Programm arg übergeben wird, möchten Sie beliebige Eingaben an das Programm übergeben. Ist das korrekt? –

+0

Umm nicht wirklich. Sprechen Sie über Methoden oder Funktionen? Ich spreche über eine Klasse im im Argument übergeben und wenn ich die Hauptmethode ausführen, sollte es die Textdatei lesen, aber es tut es nicht. Mein Code ist Scanner sc1 = neuer Scanner (neue Akte (args [0])); Beim Debugging konnte es diese Zeile nicht einmal passieren. – Victor

Antwort

8

Verwenden Sie keine relativen Pfade in java.io.File.

Es wird relativ zu dem aktuellen Arbeitsverzeichnis, das davon abhängt, wie Sie die Anwendung ausführen, die wiederum nicht von innerhalb Ihrer Anwendung steuerbar ist. Es wird nur zu Portabilitätsproblemen führen. Wenn Sie es in Eclipse ausführen, ist der Pfad relativ zu /path/to/eclipse/workspace/projectname. Wenn Sie es in der Befehlskonsole ausführen, wird es relativ zu derzeit geöffneten Ordner sein (obwohl, wenn Sie den Code durch absoluten Pfad ausführen!). Wenn Sie es durch Doppelklicken auf die JAR-Datei ausführen, wird dies relativ zum Stammordner der JAR-Datei sein. Wenn Sie es auf einem Webserver ausführen, wird es relativ zu /path/to/webserver/binaries sein. Und so weiter.

Verwenden Sie immer absolute Pfade in java.io.File, keine Ausreden.

Für die beste Portabilität und weniger Kopfschmerzen mit absoluten Pfaden, legen Sie die Datei einfach in einen Pfad, der durch den Klassenpfad der Laufzeit abgedeckt wird (oder fügen Sie ihren Pfad dem Klassenpfad der Laufzeit hinzu). Auf diese Weise können Sie die Datei von Class#getResource() oder ihren Inhalt von Class#getResourceAsStream() erhalten. Wenn es sich im selben Ordner (Paket) wie Ihre aktuelle Klasse befindet, befindet es sich bereits im Klassenpfad. Um darauf zuzugreifen, gehen Sie einfach:

public MyClass() { 
    URL url = getClass().getResource("filename.txt"); 
    File file = new File(url.getPath()); 
    InputStream input = new FileInputStream(file); 
    // ... 
} 

oder

public MyClass() { 
    InputStream input = getClass().getResourceAsStream("filename.txt"); 
    // ... 
} 
+0

Sie können das Arbeitsverzeichnis in Eclipse angeben. Es steht im Dialog unter "Ausführen als". Es ist eine Möglichkeit, relative Pfade zu verwenden und dennoch vernünftiges Verhalten innerhalb der Eclipse zu erhalten. –

+0

Es stimmt, es wird immer Workarounds und DuckTapes geben, aber Sie wollen nicht, dass Ihre Anwendung dauerhaft davon abhängig ist, wenn es viel bessere Möglichkeiten gibt. – BalusC

1

Versuchen Sie, einen absoluten Pfad zum Dateinamen anzugeben.

Geben Sie auch den Code ein, damit wir sehen können, was genau Sie versuchen.

+0

Es kann diese Zeile nicht passieren: Scanner sc1 = neuer Scanner (neue Datei (args [0])); und ich übergab meine Textdatei als das erste arg – Victor

+0

Kombinieren von Zeilen kann helfen, Code zu verkürzen und möglicherweise die Leistung (Geschwindigkeit) zu verbessern, aber beim Debuggen hilft es, Dinge aufzuteilen (dh Konstruktoren nicht in Konstruktoren einzubetten). Erstellen Sie ein Dateiobjekt, sehen Sie, ob dies der Ort ist, an dem das Programm stolpert. Wenn nicht, dann übergeben Sie das File-Objekt an Scanner (in einer separaten Zeile) und sehen Sie, welche Art von Fehler ausgelöst wird. – chimeracoder

0

Wenn Sie Eclipse (oder eine ähnliche IDE) verwenden, liegt das Problem an der Tatsache, dass Ihr Programm von einigen Verzeichnissen oberhalb der eigentlichen Quelle ausgeführt wird. Versuchen Sie, Ihre Datei in der Projektnavigation ein oder zwei Ebenen höher zu verschieben.

Check out this question für weitere Details.

0

Wenn Sie legen Sie die Datei und die Klasse mit unter gleichen Paket arbeiten, können Sie diese verwenden:

Class A { 


    void readFile (String fileName) { 
    Url tmp = A.class.getResource (fileName); 
    // Or Url tmp = this.getClass().getResource (fileName); 

    File tmpFile = File (tmp); 

    if (tmpFile.exists()) 
     System.out.print("I found the file.") 

    } 

} 

Es hilft, wenn Sie über Classloader lesen.

0

Wenn Sie eine Datei mit einem relativen Dateinamen in Java (und im Allgemeinen) öffnen, wird sie relativ zum Arbeitsverzeichnis geöffnet.

können Sie das aktuelle Arbeitsverzeichnis des Prozesses

String workindDir = new File(".").getAbsoultePath() 

Stellen Sie sicher, mit finden Sie Ihr Programm aus dem richtigen Verzeichnis ausgeführt werden (oder die Dateinamen ändern, so dass es relativ sein, wo Sie laufen es von).

+0

Das aktuelle Arbeitsverzeichnis ist auch über die Systemeigenschaft "user.dir" verfügbar. –

0

Die einfachste Lösung zu schaffen, ist eine neue Datei, dann sehen, wo die Ausgabedatei ist. Das ist der richtige Ort, um Ihre Eingabedatei zu speichern.

Verwandte Themen