0

我显然就是这样做的,不知道怎么做。或者为什么......或者究竟是什么。

好的,这是设置

我正在使用 OpenDSSEngine.dll 和由此过程生成的 com4j java 接口运行 OpenDSS 模拟:https ://com4j.java.net/tutorial.html

因为我要求 OpenDSS 服务器能够在不同的机器上运行,所以我在 java 中实现了一个客户端/服务器(文本和对象传输),一切都很好......

现在我希望能够运行“工作站模式”(在本地直接在我的应用程序中调用 com)。另外,我想稍微介绍一下。所以我写了一个 Runner(线程,调用函数)和一个 Wrapper(处理来自 runner 的函数调用,包括对结果的处理)。

包装器包含一个抽象类的实现,它将是客户端(套接字通信)或服务器端(工作站模式,com 对象)实现。

现在的问题是:

大规模编辑

经过更多测试后,我现在可以更好地描述确切问题所在。

启动 COM 接口会中断文件 IO。工作目录以某种方式更改。以一种糟糕的方式。调用任何和每个 java 函数都会显示它应该在的工作目录。这是我执行java的地方。

但是出于某种原因,工作目录是 dll 存储数据的地方。

我已经验证了这一点,将其中一个文件放在那里并尝试从中读取(已修改,请参阅第一个字符)。

代码:

// working dirs
Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);

String current;
try {
  current = new java.io.File(".").getCanonicalPath();
  System.out.println("Current dir:" + current);
} catch (IOException e2) {
  e2.printStackTrace();
}

String currentDir = System.getProperty("user.dir");
System.out.println("Current dir using System:" + currentDir);

// try read java location

try {
  BufferedReader in = new BufferedReader(new FileReader("1Neues_Netz_EXP_CAPACITY.csv"));
  in.read();
  in.close();
} catch (FileNotFoundException e) {
  System.out.println("Failed: local creation");
  e.printStackTrace();
} catch (IOException e) {
  System.out.println("Failed: local read");
  e.printStackTrace();
}

// COM-Init

OpenDSS.IDSS DSS = ClassFactory.createDSS();

System.out.println("dssinit");

// working dirs, again
    Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);

String current;
try {
  current = new java.io.File(".").getCanonicalPath();
  System.out.println("Current dir:" + current);
} catch (IOException e2) {
  e2.printStackTrace();
}

String currentDir = System.getProperty("user.dir");
System.out.println("Current dir using System:" + currentDir);

// try read java location

try {
  BufferedReader in = new BufferedReader(new FileReader("1Neues_Netz_EXP_CAPACITY.csv"));
  in.read();
  in.close();
} catch (FileNotFoundException e) {
  System.out.println("Failed: local creation");
  e.printStackTrace();
} catch (IOException e) {
  System.out.println("Failed: local read");
  e.printStackTrace();
}

// try read COM location
try {
  BufferedReader in = new BufferedReader(new FileReader("Neues_Netz_EXP_CAPACITY.csv"));
  in.read();
  in.close();
} catch (FileNotFoundException e) {
  System.out.println("Failed: dss creation");
  e.printStackTrace();
} catch (IOException e) {
  System.out.println("Failed: dss read");
  e.printStackTrace();
}

结果:

Current relative path is: D:\Feustel\Aufträge\OROP\source\04 - Products\OROP
Current dir:D:\Feustel\Aufträge\OROP\source\04 - Products\OROP
Current dir using System:D:\Feustel\Aufträge\OROP\source\04 - Products\OROP

java.io.FileNotFoundException: 1Neues_Netz_EXP_CAPACITY.csv (Das System kann die angegebene Datei nicht finden)
  at java.io.FileInputStream.open(Native Method)
  at java.io.FileInputStream.<init>(Unknown Source)
  at java.io.FileInputStream.<init>(Unknown Source)
  at java.io.FileReader.<init>(Unknown Source)
  at dev_tests.WorkstationModeTest2.main(WorkstationModeTest2.java:76)

dssinit

Current relative path is: D:\Feustel\Aufträge\OROP\source\04 - Products\OROP
Current dir:D:\Feustel\Aufträge\OROP\source\04 - Products\OROP
Current dir using System:D:\Feustel\Aufträge\OROP\source\04 - Products\OROP

Failed: local creation

异常中的第 76 行是 dss 初始化之后的行。那是你的java;)

是我使用的所有 com 和 opendss 文件的链接。

我会将这个提交给开发 com4j 的人以及开发 opendss 的人。

当然,如果有人能告诉我,我会很高兴,这是 com4j 还是 opendss 引擎的问题。不管有没有简单的方法来解决这个问题。

4

1 回答 1

0

好的,OpenDSS 开发人员回复并确认了进程级别的工作目录的更改。

Java 没有注意到这一点。也许那是因为 java 需要通过它自己的接口进行更改才能注意到它。不知道。

我仍在调查为什么引擎在初始化时强制使用默认工作目录。这可能是引擎中的硬编码或自动转换的结果。

我目前的解决方案是将引擎的数据路径设置为 java 工作目录。

修改初始化:

// COM-Init
OpenDSS.IDSS DSS = ClassFactory.createDSS();
DSS.dataPath(System.getProperty("user.dir"));

这意味着任何 OpenDSS 数据的导出都将转储到 java 工作目录中。不是最好的解决方案,但它有效。我可能会在稍后的程序中将其清除。

编辑:我得到了开发人员的确认。启动时,引擎会尝试找出它的工作目录应该是什么并将其设置为......在进程级别。为什么它会逃避我。我不知道任何需要它的编程语言,因为操作系统已经处理了这个......除此之外,我看不出有任何理由在引擎中包含自动化过程......

无论如何,除非开发人员改变这一点,否则对于任何使用 java 接口的人来说,这个问题将继续存在。

我会将此标记为解决方案,直到我得到消息说这已经改变......

于 2014-02-07T13:45:58.077 回答