【问题标题】:Using the java System.getProperty("Import")使用 java System.getProperty("Import")
【发布时间】:2013-11-15 13:43:33
【问题描述】:

我正在为大学做一些工作,我的主要工作是:

Spreadsheet sheet = new Spreadsheet(0,0);
SpreadsheetManager manager = new SpreadsheetManager(sheet);

/* Read an Import file, if any */
String filename = System.getProperty("import");

if (filename != null)
    sheet.parseInputFile(filename, sheet);

问题是,当我实际尝试导入一个文件时,它并没有执行应有的操作,并且文件名始终为空,因此它永远不会到达我的 parseInputFile。

我的老师们为不同的编程练习编写了一堆代码,这些代码可以做类似的事情,我还查看了我的同事在前几年所做的项目,但每个人都在做我上面所做的事情。

我必须像这样运行我的程序:java -Dimport=A-002-002-M-ok.import calc.textui.Calc 否则老师给出的测试都不会运行。

如果这不是一个有用的问题,我很抱歉,但我已经尝试过到处寻找。如果有人能解释System.getProperty("import") 的工作原理以及为什么它在这种情况下不起作用,我将不胜感激。

【问题讨论】:

  • 您在哪里以及如何设置该属性?
  • 你想用属性“import”获得什么?
  • @luanjot 我正在尝试为我的电子表格导入一个包含大量初始化的文本文件。
  • @Ingo 我该怎么做?因为我在任何地方都没有看到任何例子:/
  • @RitaPereira 你可以用 System.setProperty("import", "yourfile.txt") 来做,但我不知道这是否是你想要的......

标签: java system-properties


【解决方案1】:

我建议你看看documentation of System.getProperty()

基本上它从系统中检索一个值,无论是已经存在的还是由您设置的。

为避免检索null,您可以使用另一个指定默认值的方法签名:

System.getProperty("import", "file.txt");

要设置系统属性,您可以在启动时指定它:

java -Dimport="file.txt" your_application

或以编程方式设置:

System.setProperty("import", "file.txt");

【讨论】:

  • 问题是我不想导入“静态”单个文件,而是导入一系列不同的测试,不同的初始化和不同的名称。
  • 那么您可能应该看看 java 命令行参数。每次您调用您的应用程序时,都使用不同的路径指向您要导入的文件。见docs.oracle.com/javase/tutorial/essential/environment/…
  • 这就是我在启动时所做的:java -Dimport=A-002-002-M-ok.import calc.textui.Calc;很抱歉打扰你,但我真的不明白这哪里不对,我越来越困惑了。
【解决方案2】:

当你运行你的程序时:

java -Dimport=foo

然后是方法调用

System.getProperty("import")

应该返回“foo”。

是否可以编写一个小示例程序来说服自己?没有任何 SheetManagers 和所有东西,只是

class ItWorks {
public static void main(String[] args) {
   System.out.println(System.getProperty("import"));
}
}

这样称呼

java -Dimport=indeed ItWorks

并报告发生了什么。

话虽如此:如果你想传递命令行参数,为什么不使用命令行参数的工具呢? (即传递给 main 的 String[] 数组?)

然后你可以这样调用你的程序:

java calc.textui.Calc my-nice-spreadsheet.data

================================================ ======

请在您的calc.textui.Calc 程序中立即在您的类定义的左大括号之后写下以下内容:

public class Calc ..... {   // a line like this already exists
    // insert next line here
    public static String filename = System.getProperty("import");

    // rest of your class, as before.
}

然后注释掉方法中不起作用的 getProperty() 行,但保留其余部分,包括 System.out.println(filename);

有变化吗?

【讨论】:

  • 它返回“确实”...但我原始代码中的同一行返回 null... 至于后者,教师运行的测试是使用 java -Dimport=A-002 调用的-002-M-ok.import calc.textui.Calc;所以我不确定我是否可以这样做。
  • @RitaPereira“但我原始代码中的同一行返回 null”你怎么知道?而且,顺便说一句,您当然可以使用 `-Dimport=A-002-002-M-ok.import` 运行您的小型测试程序
  • 我尝试添加一个 System.out.println(filename) 并且它返回 null,它不应该返回 A-002-002-M-ok.import 吗?
  • 是的,应该。而且,正如您在其他程序中看到的那样,它会的。但如果不是,这意味着您的代码中有一些我们还不知道的东西。
  • @RitaPereira 请参阅我的建议如何跟踪错误。
【解决方案3】:

也许系统属性并不是最常用的方法(取决于您的应用程序)。
您还可以使用命令行参数将文件名传递给您的 main 方法:

public class CommandLineExample {

    public static void main(String[] args) {
        if (args.length < 1) {
            System.err.println("usage: CommandLineExample <filename>");
            System.exit(1);
        }

        String filename = args[0];
        if (filename !=null && !filename.isEmpty()) {
            ...
        }
    }

}

你的程序应该被称为:

    java CommandLineExample theFileName

字符串 "theFileName" 将被传递给 args[0] 中的 main 方法(任何额外的单词都将在 args {args[1], args[2], ...} 的后续位置传递)

编辑
如果程序必须用

调用
    java -Dimport=filename ... 

然后System.getProperty("import") 将返回文件名。
确认您正在调用正确的程序(类名、包、版本、上次编译是否成功,...)并检查该属性是否像 java -Dinport=A-... 那样输入错误或有额外的空格、大写字母...

【讨论】:

  • 我必须像这样运行我的程序:java -Dimport=A-002-002-M-ok.import calc.textui.Calc 否则老师给出的测试都不会运行
  • @RitaPereira 两种可能:调用错误的程序,或者没有设置“导入”。你确定不是用“java -Dinport=A-...”或其他一些拼写错误(如空格、大写、...
猜你喜欢
  • 1970-01-01
  • 2013-10-07
  • 2017-08-02
  • 2014-09-02
  • 2021-11-12
  • 1970-01-01
  • 2011-03-31
  • 2013-05-08
  • 2015-09-03
相关资源
最近更新 更多