2016-05-19 1 views
0

J'ai un programme qui est censé prendre des entrées de la ligne de commande et les diriger vers l'entrée standard et diriger la sortie vers sortie standard. Le code censé être entré dans la ligne de commande est censé se présenter comme suit:Exécution du programme Java via l'invite de commande avec les fichiers d'entrée et de sortie

java package.sub.Calc < input-file > output-file 

ou

echo some inputs to the calculator | java  
package.sub.Calc 

Mais je ne peux pas sembler le faire fonctionner correctement. L'objectif est d'être en mesure de passer un fichier texte dans le programme ou écrire vos problèmes de mathématiques là, sur la ligne de commande et la conduite dans.

Le programme fonctionne correctement pour

java -cp . package.sub.Calc 

et ayant la type d'utilisateur dans leur problème et en appuyant sur Entrée.

Si j'ai un fichier nommé input.txt et que vous voulez l'appeler à partir de la ligne de commande et que les réponses soient imprimées dans la ligne de commande (le programme est conçu pour System.out.println) comment entrerais-je cette information? Mon code actuel implémente un Scanner pour System.in. Devrais-je utiliser autre chose pour que cela fonctionne? Je suis nouveau à courir n'importe quoi dans l'invite de commande et ne peux pas sembler l'obtenir pour fonctionner.

Toute aide est grandement appréciée.

Mon code:

public static void main(String[] args) { 
    Calc calc = new Calc(); 
    Scanner sc = new Scanner(System.in); 
    StringBuilder sb = new StringBuilder(); 
    String input = ""; 
    List<String> strs = new ArrayList<>(); 
    ArrayList<String> tokens; 
    while (sc.hasNextLine()) { 
     String line = sc.nextLine().trim(); 
     if (line.isEmpty()) { 
      for (String s : strs) { 
       sb.append(s); 
       input = sb.toString(); 
      } 
      tokens = new ArrayList<>(Arrays.asList(input.split(" "))); 
      //call calculate and reset 
      calc.calculate(tokens); 
      strs.clear(); 
      tokens.clear(); 
      sb.setLength(0); 
      input = ""; 
     } else if (line.length() == 1) { 
      strs.add(" "); 
      strs.add(line); 
      strs.add(" "); 
     //manual user exit case 
     } else if (line.equals("EXIT")){ 
      System.exit(0); 
     }else { 
      strs.add(line); 
     } 
    } 
} 
+0

Que diriez-vous juste de prendre le nom de fichier comme 'String' dans la ligne de commande, puis en utilisant cette chaîne en Java pour ouvrir le fichier? jetez un oeil à cet exemple http://www.mkyong.com/java/how-to-read-file-from-java-bufferedreader-example/ – jmcg

+0

Veuillez fournir le code que vous avez déjà. Ce que vous décrivez devrait fonctionner correctement, donc s'il y a un problème, il existe probablement sur votre implémentation. – Tim

+0

@Tim a ajouté ma méthode principale. Je ne suis pas sûr si le problème est mon code ou ce qui im ​​entrant dans la ligne de commande. Comment est-ce que je passerais dans input.txt par exemple? – Alkarin

Répondre

1

Vous semblez avoir 2 problèmes.

1) Vous incluez l'option de ligne de commande -cp lorsque vous exécutez le programme manuellement, mais pas lorsque vous essayez de lire à partir de l'entrée. Vous en avez besoin dans les deux cas - c'est dire java où trouver votre fichier de classe.

2) La façon dont vous gérez votre entrée ne correspond pas à l'entrée vous passez dans.

Vous appelez seulement calculate lorsque vous recevez une ligne vide (if(line.isEmpty())), mais quelque chose comme

echo some inputs to the calculator | java -cp . package.sub.Calc 

ne génère jamais de ligne vide.

Soit vous devez faire:

printf "%s\n\n" "some inputs to the calculator" | java -cp . package.sub.Calc 

ou modifier la condition qui déclenche une calculate (probablement en invoquant l'extérieur de la boucle while).

+0

1) Cela semble être mon problème et fait l'affaire! – Alkarin

+0

2) J'ai essayé le code printf que vous avez fourni et j'ai reçu un 'n'est pas reconçu comme une commande interne ou externe' – Alkarin

+0

Ah, on dirait que vous utilisez Windows. Dans ce cas, l'option 'printf' ne fonctionnera pas, mais vous pouvez obtenir le résultat souhaité en vous assurant que le fichier que vous envoyez a une ligne vide à la fin. – Tim

-1

votre entrée est reçue dans votre méthode main. public static void main (String[] args). Le tableau args est le tableau qui recevra vos paramètres d'entrée si vous avez couru votre programme java -cp . <main_class_pat> <arg0> <arg1> ...

Assurez-vous que votre tableau args a la longueur désirée ... et si oui, votre fichier d'entrée serait à arg[0]

+2

Alkarin veut lire à partir de _stdin_ ('System.in'), pas à partir des arguments de la ligne de commande. – Tim