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?
Antwort
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");
// ...
}
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. –
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
Versuchen Sie, einen absoluten Pfad zum Dateinamen anzugeben.
Geben Sie auch den Code ein, damit wir sehen können, was genau Sie versuchen.
Es kann diese Zeile nicht passieren: Scanner sc1 = neuer Scanner (neue Datei (args [0])); und ich übergab meine Textdatei als das erste arg – Victor
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
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.
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.
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).
Das aktuelle Arbeitsverzeichnis ist auch über die Systemeigenschaft "user.dir" verfügbar. –
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.
- 1. Wie übergebe ich Inhalt einer Textdatei als URL-Parameter
- 2. Wie übergebe ich eine Java-Funktion ein String [] Argument?
- 3. Eine Methode als Argument übergeben
- 4. Wie übergebe ich @selector als Parameter?
- 5. Wie übergebe ich Funktion als Parameter an eine andere Funktion?
- 6. Wie übergebe ich eine Funktion als Parameter in Emacs Lisp?
- 7. Wie übergebe ich eine Funktion als Parameter in Lua?
- 8. Wie übergebe ich eine Variable als Array durch Komma getrennt?
- 9. Wie übergebe ich einen Verweis auf eine Methode als Parameter
- 10. Wie übergebe ich eine Zeichenfolge als Methodenparameter in objective-c?
- 11. Wie übergebe ich ein Argument an array.map short cut?
- 12. Wie übergebe ich eine Zeichenkette an setContentView()?
- 13. Wie übergebe ich $ (this) an eine Funktion?
- 14. Wie übergebe ich eine Funktion an Enum.each?
- 15. Wie übergeben und eine Funktion als Argument in Javascript aufrufen?
- 16. subprocess.Popen: wie eine Liste als Argument übergeben
- 17. Wie eine Funktion als Argument in Rust
- 18. Wie übergebe ich ein wxWidget an eine generische Funktion?
- 19. Wie übergebe ich eine Liste als Eingabe einer Funktion in Python
- 20. Wie übergebe ich Kommandozeilenargumente an ipython
- 21. Wie übergebe ich einen primitiven Datentyp als Referenz?
- 22. Wie übergebe ich Methode als Parameter in Java?
- 23. Wie kann ich Integer als Argument in jq setzen?
- 24. Wie übergebe ich Referenzen als Methodenparameter über AppDomains?
- 25. Wie übergebe ich Versprechungen als direktive Attribute in Angular
- 26. Wie übergebe ich den Wert von JSF param als Methodenparameter?
- 27. Wie übergebe ich NSData als NSString und bekomme es zurück?
- 28. Wie übergebe ich dynamische Parameter in Powershell?
- 29. Wie übergebe ich gebundene Daten an eine Funktion in d3?
- 30. Wie übergebe ich Kommandozeilenargumente an atom-runner
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? –
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