putty命令行参数与java行为奇怪

时间:2014-03-29 05:27:21

标签: java putty

我需要我的代码读取文件路径并在文件路径的末尾分析文件,并且如果没有给出有效路径,则必须根据分配退出。当我输入类似“java ClassName途径/文件”的东西时,虽然它只是接受更多的输入。如果我然后放入完全相同的路径它会按照我想要的方式进行,但它需要以前一种格式进行。我不应该使用扫描仪吗? (TextFileAnalyzer是我编写的另一个进行文件分析的类,很明显)

import java.util.Scanner;

public class Assignment8 {

    public static void main(String[] args) {
        Scanner stdin = new Scanner(System.in);
        String path = null;
        TextFileAnalyzer analysis = null;
        if (args.length == 0 || java.lang.Character.isWhitespace(args[0].charAt(0)))
            System.exit(1);
        try {
            path = stdin.next();
            analysis = new TextFileAnalyzer(path);
        } catch (Exception e) {
            System.err.println(path + ": No such file or directory");
            System.exit(2);
        }
        System.out.println(analysis);
        stdin.close();
        System.exit(0);

    }
}

1 个答案:

答案 0 :(得分:3)

命令行中指定的参数与通过控制台上的标准输入输入的信息不同。从System.in读取将允许您读取输入,这与命令行参数无关。

您当前的非工作代码的问题在于,当您检查是否指定了参数时,您实际上并未使用args[0]作为路径名,您只是继续阅读用户输入无论如何。

命令行参数通过String[]参数传递给main。在你的情况下,它是第一个参数,因此它将在args[0]

public static void main (String[] args) {
   String pathname;
   if (args.length > 0) {
       pathname = args[0]; // from the command line
   } else {
       // get pathname from somewhere else, e.g. read from System.in
   }
}

或者,更严格:

public static void main (String[] args) {
   String pathname;
   if (args.length > 1) {
       System.err.println("Error: Too many command line parameters.");
       System.exit(1);
   } else if (args.length > 0) {
       pathname = args[0]; // from the command line
   } else {
       // get pathname from somewhere else, e.g. read from System.in
   }
}

查看official tutorial on command-line arguments了解详情。


顺便说一下,我注意到你的if条件中有这个:

java.lang.Character.isWhitespace(args[0].charAt(0))

前导和尾随空格会自动从不带引号的命令行参数中删除,因此除非用户明确使用引号并执行以下操作,否则它将始终为false

java ClassName "   something"

即使在这种情况下,您可能只想接受它并使用args[0].trim()更宽松。