我显然就是这样做的,不知道怎么做。或者为什么......或者究竟是什么。
好的,这是设置:
我正在使用 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 引擎的问题。不管有没有简单的方法来解决这个问题。