Eclipse liest stdin (System.in) aus einer Datei

Antworten:

59

Reines Java

Sie können System.in mit einer einzigen Codezeile umleiten:

System.setIn(new FileInputStream(filename));

Siehe System.setIn () .

Eclipse-Konfiguration

In Eclipse 4.5 oder höher kann im Dialogfeld zum Starten der Konfiguration System.in so eingestellt werden, dass es aus einer Datei liest. Siehe die Ankündigung hier .

Registerkarte "Allgemein" des Dialogfelds "Konfiguration starten"

Michael Myers
quelle
12

[Update] Wie in den Kommentaren erwähnt, war diese Antwort irreführend, daher habe ich sie aktualisiert, um die Fehler zu korrigieren. [/Aktualisieren]

An der Bash- oder Eingabeaufforderung können Sie Folgendes tun: C:\myprogramm < file.txt(Windows) oder ./myprogramm < file.txt (Linux)

Leider ist es in Eclipse nicht möglich, dasselbe Ergebnis zu erzielen, da es keine Option gibt, das stdin an eine Datei in Eclipse zu binden. Stattdessen müssen Sie einen Dateistream in Ihrem Code manuell öffnen und stattdessen daraus lesen. Eine Möglichkeit, dies zu tun, besteht darin, ein Programmargument zu verwenden, um es zu aktivieren, und eine andere mit dem Dateiparameter. Sehen Sie sich Scotts Antwort an, welche Art von Code Sie hinzufügen müssen, um die Option -d aus dem Programmargument-Array zu analysieren.

Wenn Sie auf eine Datei in Ihrem Eclipse-Projekt verweisen möchten, müssen Sie darauf achten, den richtigen Speicherort zu finden und die Variable $ {resource_loc:} verwenden:

-d ${resource_loc:/MyProject/file}

Natürlich können Sie auch einen absoluten Pfad angeben:

-d path/to/file or -d C:\path\to\file

Der Parameter resource_loc bezieht sich auf Ihren Arbeitsbereich. Dies ist der Ordner, in dem alle Eclipse-Projekte gespeichert sind. Von dort aus müssen Sie noch auf Ihren Projektordner und dann auf die Datei verweisen, die Sie laden möchten.

Je nachdem, ob Sie Linux oder Winodws verwenden, müssen Sie möglicherweise die Schrägstrichrichtung anpassen.

Lanoxx
quelle
4
Die Option '-d' unter Konfiguration ausführen -> Argumente scheint nicht zu funktionieren. Zumindest nicht in Eclipse 3.7.1
Sagar Jauhari
1
Sie müssen Ihrem Programm auch eine Art Logik hinzufügen , um mit diesen Argumenten umgehen zu können, sonst funktioniert dies allein nicht.
Scott
4
Diese Antwort hat nichts mit std.in zu tun. Sie lernen, Dateien zu öffnen, anstatt std.in zu lesen. Warum erhalten falsche und irreführende Antworten so viele positive Stimmen?
Val
12

Update 2015

Es gibt eine neue Eclipse-Version, Eclipse 4.5 (Mars), die das Problem behoben hat !

Dies ist die Ankündigung und Beschreibung der Funktion: http://eclipse.org/mars/noteworthy/#_assigning_stdin_to_a_file

Stdin kann jetzt einer Datei auf der Registerkarte Allgemein der Startkonfigurationsdialoge zugewiesen werden . Geben Sie hier die Bildbeschreibung ein

Wie erwartet ist dies eine neue Funktion der gerade veröffentlichten Eclipse 4.5 und funktioniert daher in einer älteren Version nicht.

Petr Janeček
quelle
2
Dies ist die richtige Antwort - vorausgesetzt, Sie leben im Jahr 2015 :)
Astrojuanlu
Richtige Antwort auch ab 2016. Eclipse Neon 4.6 erleichtert das Lesen einer Eingabedatei (.in) genauso wie das Lesen von Benutzereingaben von der Konsole. Daher Scanner sc = new Scanner(System.in);funktioniert die Verwendung mit den konfigurierten Einstellungen einwandfrei. Um genau zu sein, finden Sie den obigen Bildschirm unter Ausführen> Konfigurationen ausführen> Registerkarte Allgemein.
Keith OYS
8

Auf der Registerkarte "Allgemein" des Ausführungsdialogs befindet sich unter "Standardeingabe und -ausgabe" ein Kontrollkästchen für "Datei". aber es scheint nur für die Ausgabe zu sein ...

Ich würde erwarten, dass dort zwei Dateifelder angezeigt werden, eines für Standard-In und eines für Standard-Out mit den Optionen zum Anhängen.

John Gardner
quelle
Dies funktionierte nur für die Ausgabe zum Standard Input and Output
Einfügen
6

Sie müssen Ihren Code etwas optimieren, damit dies in Eclipse funktioniert. Die anderen Antworten oben haben nicht funktioniert, als ich es versuchte. Ein anderes Sprichwort, das ich gesehen habe, um Ausführen zu ändern.> Registerkarte "Allgemein"> Standardeingabe und -ausgabe> Datei hat nur das Standardverhalten der Datei geändert, nicht die Eingabe.

Die Lösung bestand darin, die Option "-d" zu einer funktionsfähigen Lösung zu machen. Wenn Sie etwas in die Programmargumente einfügen, wird es einfach an Ihr Hauptargument übergeben. Was Sie also am Anfang von main tun können, ist ungefähr so:

    Scanner in;
    if (args!=null && args.length>0 && args[0].equals("-d")){
        in = new Scanner(new File(args[1]));
    } else {
        in = new Scanner(System.in);
    }

Sie müssen Ihre Programmargumente weiterhin im Menü Ausführen festlegen, wie in dieser Antwort beschrieben.

Scott
quelle
Angenommen, Ihr Code befindet sich in der public static void main(String [] args)Methode, müssen Sie nicht nach argsNull suchen - er enthält mindestens ein leeres Array.
Rob Gilliam
5

Die Lösung für mich (auf einem Mac mit Eclipse CDT für eine C-Anwendung ausgeführt) bestand darin, "<path / to / somefile" am Ende anderer Argumente auf der Registerkarte "Argumente" des Dialogfelds "Konfiguration ausführen" hinzuzufügen.

Überprüfen Sie auch diese andere Frage auf eine Antwort, bei der ein Java-Programm in einem angehaltenen Zustand gestartet und der Debugger dann mit Eclipse angehängt wird.

Stewart Stevens
quelle
1
Dies funktioniert auch unter Linux mit CDT 7.0. Funktioniert wahrscheinlich auch mit älteren Versionen.
Stabledog
Dies funktioniert nicht unter Linux mit Eclipse Java EE Indigo SR 1 :(
Eponymous
4

Ich sehe keine gute Möglichkeit, dies mit dem Standarddialog von Eclipse Run zu tun. Möglicherweise können Sie dies jedoch mit einem externen Tool-Launcher tun und entweder die Standardsyntax "<infile" verwenden oder ein .bat / .sh-Skript aufrufen, um dies für Sie zu tun.

Es ist nicht automatisiert, was ich vermute, aber Sie können den Inhalt Ihrer Datei kopieren und in die Eclipse-Konsole einfügen, wenn Sie Ihr Programm starten.

KC Baltz
quelle
4
< ${workspace_loc:/MyProject/file}

in Debug-Konfiguration / Argumente / Programmargumente:

funktioniert gut für mich.

Vlad
quelle
Eine faszinierende Möglichkeit. Ich bin gespannt, welche Version von Eclipse Sie verwenden und auf welchem ​​System. Ich habe dies mit Eclipse Juno unter Mac OS X 10.8 versucht, und der Umleitungsoperator <wird wörtlich als Befehlszeilenargument interpretiert.
Nathan Ryan
Eclipse IDE für Java-Entwickler, Version: Juno Release, Build-ID: 20120614-1722, die unter Mac OS X 10.7.5 ausgeführt wird, funktioniert hier NICHT. :(
Eddified
funktioniert auch nicht für mich mit Juno Service Release 2 in Windows 7 x64
D_Guidi
Ich verwende die Eclipse, die mit ADT unter Windows 7 x64 geliefert wird.
Vlad
2

Für Linux: Ich denke, der einfachste Weg ist, ein Sh-Skript zu schreiben.

1) schreibe run.sh wie folgt:

Ihr Programm mit Params <input.txt

2) Geben Sie in der Eclipse-Profilkonfiguration an

[tab Main] C ++ Run Application = / bin / sh

[Registerkarte Argumente] Programmargumente = run.sh.

Das ist es. Wenn Sie Ihr Projekt ausführen, wird die Ausgabe des Skripts in der Eclipse-Konsole angezeigt. Sie können etwas Ähnliches in Windows tun.

Ruslan Mavlyutov
quelle
1

Dies wird in Eclipse überraschenderweise nicht unterstützt und es scheint derzeit keine Pläne zu geben, es hinzuzufügen. Unter https://bugs.eclipse.org/bugs/show_bug.cgi?id=155411 können Sie folgen und abstimmen.

Ich werde hier aktualisieren, wenn sie es implementieren.

studgeek
quelle
Ich weiß nicht, wie ich zu Eclipse beitragen soll, aber dieser Fehler ist so ärgerlich, dass ich den Code genug studieren würde, um selbst eine Standardausgabespezifikationsbox hinzuzufügen. Das einzige Problem ist, dass ich es für Code verwenden muss, der morgen fällig ist, damit ich keine Zeit habe. Trotzdem steht es auf meiner Agenda für mein nächstes ernsthaftes Codierungsprojekt - es sei denn, jemand anderes kommt zuerst dazu. (Betrachten Sie dies als eine Herausforderung für andere Entwickler, mich bis zum Anschlag zu schlagen.)
Steve
@studgeek Ich denke, der Fehler wurde überprüft und behoben und die Funktion soll in Version: Mars (4.5) Build-ID: I20141208-2000 hinzugefügt werden. Habe ich recht?
Sunil Kumar
0

Ich habe ein Ant-Ziel erstellt und es als "Extern ausführen" von Eclipse aus gestartet. Hier sind die Schritte:

  • Ich habe eine Eingabedatei zum Lesen: res\in.txtund eine für die Ausgabe:res\out.txt
  • Erstellen Sie eine build.xmlmit den gewünschten Zielen (dies ist nur ein Beispiel):

    <project basedir="." default="run" name="Tests">
    <target name="clean">
    <delete dir="bin"/>
    </target>
    
    <target name="compile">
    <mkdir dir="bin"/>
    <javac srcdir="src" destdir="bin" includeantruntime="false"/>
    </target>
    
    <target name="build" depends="clean,compile"/>
    
    <target name="run" depends="build">
    <java classname="Main" input="res\in.txt" output="res\out.txt" classpath="bin" />
    </target>
    </project>
    
  • Gehen Sie in Eclipse zu: Run->External Tools->External Tools Configurations->Ant Build-> New Launch ConfigurationVerwenden Sie die folgende Konfiguration:

Section Main

Buildfile: ${workspace_loc:/Tests/build.xml}

Basisverzeichnis: ${workspace_loc:/Tests}

* Hinweis: Tests ist der Name meines Eclipse-Projekts

Jetzt können Sie Ihr Projekt ausführen, indem Sie auf die Symbolleistenschaltfläche Extenal ausführen klicken und die Eingabe- oder Ausgabedateien nach Bedarf ändern

drverboten
quelle