在命令提示符下运行时执行期间无法找到文件

时间:2016-08-22 11:55:35

标签: java jar runtime

这里所有专家的好日子,

我在命令提示符下运行以下命令时收到FileNotFoundException:

c:\TA\java -jar LoginCaptchaChrome.jar LoginCaptchaChrome https://2015.qa.int.www.mol.com/ C:\\TA\\TD\\Login\\Login.xlsx C:\\TA\\TR\\LoginCaptchaChrome_22082016_1838.xlsx

错误信息如下:

`Exception in thread "main" java.io.FileNotFoundException: C:\TA\TR\LoginCaptchaChrome_22082016_1838.xlsx" (The filename, directory name, or volume label syntax is incorrect)
        at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(Unknown Source)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at LoginCaptchaChrome.main(LoginCaptchaChrome.java:58)

我实际上是从命令提示符和文件

传递参数
LoginCaptchaChrome_22082016_1838.xlsx` is not being passed to the code line :

FileOutputStream fos = new FileOutputStream("\"" + args[3] + "\"");

在以下代码中:

public class LoginCaptchaChrome {

public static void main(String[] args) throws IOException, InterruptedException{
        String tc = args[0];
        String address = args[1];
        String test_data = args[2];
        String test_result = args[3];`

        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Lam Chio Meng\\Desktop\\work\\chromedriver_win32\\chromedriver.exe");     

        FileOutputStream fos = new FileOutputStream("\"" + args[3] + "\"");
        XSSFWorkbook workbook = new XSSFWorkbook();                             

希望得到专家的建议。提前谢谢。

1 个答案:

答案 0 :(得分:2)

问题来自对如何在命令行传递参数的误解。

以shell为例。在提示符处假设此命令:

someCommand "arg with spaces"

该过程的论点实际上是:

  • someCommand
  • arg with spaces。是的,这只是一个论点。

这意味着您遇到的问题是这一行:

new FileOutputStream("\"" + args[3] + "\"");

根本不需要前导和尾随引号。

此外,由于这是2016年,因此请勿使用FileOutputStream。使用JSR 203:

final Path path = Paths.get(args[3]);
final OutputStream out = Files.newOutputStream(path);

查看Java程序实际看到参数的一种简单方法是这样的程序:

public final class CmdLineArgs
{
    public static void main(final String... args)
    {
        final int len = args.length;

        System.out.println("---- Begin arguments ----");
        IntStream.range(0, len)
            .map(index -> String.format("Arg %d: %d", index + 1, args[index])
            .forEach(System.out::println);
        System.out.println("---- End arguments   ----");

        System.exit(0);
    }
}

尝试并在提示符处运行此命令,例如:

java MyClass foo bar

java MyClass "foo bar"

并看到差异。