【问题标题】:Change a program to accept command line arguments更改程序以接受命令行参数
【发布时间】:2016-01-12 21:54:47
【问题描述】:

我有以下代码,想修改它以接受命令行参数,而不是使用扫描仪读取文件。您能指出我需要在代码中进行的一些更改吗?任何帮助表示赞赏。我将有一个名为 prgm.cmd 的文件,并将在 UNIX 上执行它,如下所示。 prgm.cmd 是实际参数!

java Commander prgm.cmd

现在我只能通过使用来让程序工作

java Commander < prgm.cmd

代码

import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Commander
{
    public static void main(String[] args)
    {
        Map<String,Integer> expression = new HashMap<String,Integer>();
        ArrayList<String> list = new ArrayList<String>();

        Scanner sc = new Scanner(System.in);

        while(true)
        {
            list.add(sc.nextLine());
            if(!sc.hasNextLine()) break;
        }

        ArrayList<String> tokens = new ArrayList<String>();
        ArrayList<String> PRINT = new ArrayList<String>();


        for(String element : list) {
            StringTokenizer st = new StringTokenizer(element);

            if(!element.startsWith("PRINT")) {
                while(st.hasMoreTokens()) {
                    tokens.add(st.nextToken());
                }

                expression.put(tokens.get(0),Integer.parseInt(tokens.get(2)));
                tokens.clear();
            } else {
                while(st.hasMoreTokens())
                    PRINT.add(st.nextToken());
                System.out.println(expression.get(PRINT.get(1)));
                PRINT.clear();
            }
        }
    }
}

示例命令文件:PRGM.CMD

A = 6   
C = 14
PRINT C 
B = 12
C = 8
PRINT A

输出

14
 6

【问题讨论】:

  • 命令行参数将在args参数中传递给main方法。

标签: java command-line-arguments


【解决方案1】:
public static void main(String[] args)
//                      ^^^^^^^^^^^^^

当你运行你的程序时:

java progname arg1 arg2

参数出现在传递给main() 的字符串数组中。你只需从那里提取它们并做你需要的。

下面的小(但完整)程序展示了这一点。它会回显你的论点,每行一个:

public class Test {
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++)
            System.out.println (args[i]);
    }
}

这是将命令作为参数传递给程序。


相反,如果您希望将命令保留在文件中,并且只需向程序提供 文件名,您只需将扫描仪更改为使用基于文件的阅读器而不是 @ 987654325@。以下程序接受文件名参数,然后将其回显到屏幕:

import java.io.FileInputStream;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
    try {
        Scanner sc = new Scanner (new FileInputStream(args[0]));
        while (sc.hasNextLine())
            System.out.println (sc.nextLine());
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}

您甚至可以将其设为可选,例如使用 - 指示标准输入的 UNIX 过滤程序。

如果您想使用提供的文件但如果没有则恢复为标准输入,您可以执行以下操作:

Scanner sc;
if (args.length > 0)
    sc = new Scanner (new FileInputStream(args[0]));
else
    sc = new Scanner (System.in);

// Now just use scanner as before

【讨论】:

  • 我明白,但我似乎总是得到一个 arrayoutofbounds 错误,我如何将任意数量的命令行参数从文件读入 String[] args 数组?我可以将 ArrayList 而不是 String[] 传递给 main 吗?
  • @MutatingAlgorithm,我添加了一个小示例,向您展示,您只需确保不超出数组的末尾。
  • 是否可以简单地将 System.in 更改为 File 对象?
  • @MutatingAlgorithm:是的,我也为此添加了一个额外的位。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2013-09-26
  • 2013-11-24
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多