web-dev-qa-db-fra.com

Eclipse lisant stdin (System.in) à partir d'un fichier

Est-il possible pour Eclipse de lire stdin à partir d'un fichier?

67
Kevin

Java pur

Vous pouvez rediriger System.in avec une seule ligne de code:

System.setIn(new FileInputStream(filename));

Voir System.setIn () .

Configuration Eclipse

Dans Eclipse 4.5 ou version ultérieure, la boîte de dialogue de configuration de lancement peut définir System.in pour lire à partir d'un fichier. Voir l'annonce ici .

Common tab of Launch Configuration dialog

58
Michael Myers

[Update] Comme cela a été souligné dans les commentaires, cette réponse était trompeuse, je l'ai donc mise à jour pour corriger les erreurs. [/ Update]

Sur bash ou invite de commandes, vous pouvez faire: C:\myprogramm < file.txt (Windows) ou ./myprogramm < file.txt (Linux)

Malheureusement, dans Eclipse, il n'est pas possible d'obtenir le même résultat, car il n'y a pas d'option pour lier le stdin à un fichier dans Eclipse. Au lieu de cela, vous devrez ouvrir manuellement un flux de fichiers dans votre code, puis le lire à la place. Une façon de le faire est d'utiliser un argument de programme pour l'activer et un autre avec le paramètre de fichier. Voir la réponse de Scott sur le type de code que vous devez ajouter pour analyser l'option -d du tableau des arguments du programme.

Lorsque vous souhaitez pointer vers un fichier à l'intérieur de votre projet Eclipse, vous devez être prudent pour obtenir le bon emplacement et utiliser la variable $ {resource_loc:}:

-d ${resource_loc:/MyProject/file}

bien sûr, vous pouvez également mettre un chemin absolu:

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

Le paramètre resource_loc fait référence à votre espace de travail. C'est le dossier dans lequel tous vos projets Eclipse sont stockés. De là, vous devez toujours référencer votre dossier de projet, puis le fichier que vous souhaitez charger.

Vous devrez peut-être modifier la direction de la barre oblique, selon que vous utilisez Linux ou Winodws.

12
lanoxx

Mise à jour 2015

Il existe une nouvelle version d'Eclipse, Eclipse 4.5 (Mars) qui a corrigé le problème !

Voici l'annonce et la description de la fonctionnalité: http://Eclipse.org/mars/noteworthy/#_assigning_stdin_to_a_file

Stdin peut désormais être affecté à un fichier dans l'onglet Commun des boîtes de dialogue de configuration de lancement. enter image description here

Comme prévu, il s'agit d'une nouvelle fonctionnalité de l'Eclipse 4.5 qui vient de sortir et ne fonctionnera donc pas dans une ancienne version.

10
Petr Janeček

Dans l'onglet "commun" de la boîte de dialogue d'exécution, sous "Entrée et sortie standard", il y a une case à cocher pour "fichier". mais il semble que ce soit uniquement pour la sortie ...

Je m'attends à voir 2 champs de fichier là-bas, un pour l'entrée standard, un pour la sortie standard avec les options d'ajout.

8
John Gardner

Vous devrez modifier votre code pour que cela fonctionne dans Eclipse. Les autres réponses ci-dessus n'ont pas fonctionné lorsque j'ai essayé. Un autre que j'ai vu dire de changer Exécuter ..> Onglet Commun> Entrée et sortie standard> Fichier n'a changé que le comportement de la sortie standard dans le fichier, pas l'entrée.

La solution était de prendre l'option "-d" à une solution viable. Si vous mettez quelque chose dans les arguments du programme, cela sera simplement passé dans votre main. Donc, ce que vous pouvez faire au début de main est quelque chose comme ceci:

    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);
    }

Vous devrez toujours définir vos arguments de programme dans le menu Exécuter .. comme décrit dans la réponse this .

6
Scott

La solution pour moi (fonctionnant sur un Mac, utilisant Eclipse CDT pour une application C) était d'ajouter "<path/to/somefile" à la fin des autres arguments dans l'onglet "Arguments" de la boîte de dialogue "Run Configuration".

Vérifiez également cette autre question pour une réponse impliquant le lancement d'un programme Java dans un état suspendu, puis l'attachement du débogueur à l'aide d'Eclipse.

5
Stewart Stevens

Je ne vois pas une bonne façon de le faire en utilisant la boîte de dialogue d'exécution Eclipse standard. Cependant, vous pouvez peut-être le faire avec un lanceur d'outils externe et utiliser la syntaxe standard "<infile" ou appeler un script .bat/.sh pour le faire pour vous.

Ce n'est pas automatisé, c'est ce que je suppose que vous voulez, mais vous pouvez copier et coller le contenu de votre infile sur la console Eclipse lorsque vous lancez votre programme.

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

dans la configuration de débogage/arguments/arguments de programme:

fonctionne bien pour moi.

3
Vlad

Pour linux: Je pense que la façon la plus simple est d'écrire un sh-script.

1) écrivez run.sh comme ceci:

votre programme avec params <input.txt

2) Dans la configuration du profil Eclipse, spécifiez

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

[tab Arguments] Arguments du programme = run.sh

C'est ça. Lorsque vous exécuterez votre projet, vous verrez la sortie du script dans la console Eclipse. Vous pouvez faire quelque chose de similaire dans Windows.

2
Ruslan Mavlyutov

Ce n'est étonnamment pas pris en charge dans Eclipse et il semble qu'il n'y ait actuellement aucun plan pour l'ajouter. Voir https://bugs.Eclipse.org/bugs/show_bug.cgi?id=155411 pour suivre et voter.

Je mettrai à jour ici s'ils le mettent en œuvre.

1
studgeek

Ce que j'ai fait était de créer une cible Ant et de la lancer en tant que "Exécuter externe" depuis Eclipse, voici les étapes:

  • J'ai un fichier d'entrée à lire: res\in.txt et un pour la sortie: res\out.txt
  • Créer un build.xml avec les cibles dont vous avez besoin (ce n'est qu'un exemple):

    <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>
    
  • Dans Eclipse, accédez à: Run->External Tools->External Tools Configurations->Ant Build-> New Launch Configuration utilisez la configuration suivante:

Section Main

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

Répertoire de base: ${workspace_loc:/Tests}

* Remarque: Tests est le nom de mon projet Eclipse

Vous pouvez maintenant exécuter votre projet en cliquant sur le bouton de la barre d'outils Exécuter Extenal et modifier les fichiers d'entrée ou de sortie selon vos besoins

0
drverboten