我显然是这么做的,并且不知道如何。或者为什么......或者究竟是什么。
好的,这里是设置:
我使用OpenDSSEngine.dll和此过程生成的com4j java界面运行OpenDSS Simulation:https://com4j.java.net/tutorial.html
由于我要求OpenDSS Server能够在不同的机器上运行,我在java中实现了一个客户端/服务器(文本和对象传输),一切都很好......
现在我希望能够运行"工作站模式" (在我的应用程序中本地和直接调用com)。另外,我想稍微改编一下。所以我写了一个Runner(调用函数的Thread)和一个Wrapper(处理来自runner的函数调用,包括结果的处理)。
包装器包含一个抽象类的实现,它将是客户端(套接字通信)或服务器端(工作站模式,com对象)实现。
现在问题:
大量编辑:
经过一些更多测试后,我现在可以更好地描述确切问题所在。
启动COM接口会中断文件IO。工作目录以某种方式改变了。以一种糟糕的方式。调用任何一个java函数都会找到它应该在的工作目录。这是我执行java的地方。
但工作目录由于某种原因是dll存储数据的地方。
我已经验证了这一点,将其中一个文件放在那里并尝试从中读取(已修改,请参阅第一个字符)。
CODE:
// 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初始化之后的第76行。这是你的java;)
Here指向我使用的所有com和opendss文件的链接。
我会将这个提交给开发com4j的人以及开发opendss的人。
当然,如果有人在这里告诉我,我是否感到高兴,这是否是com4j或opendss引擎的问题。无论有没有,有一个简单的方法可以解决这个问题。
答案 0 :(得分:0)
好的,OpenDSS开发人员回复并确认了进程级别上工作目录的更改。
Java没有注意到这一点。也许那是因为java需要通过它自己的界面来发生变化才能注意到它。不知道。
我还在调查引擎在初始化时强制默认工作目录的原因。这可能是引擎中的硬编码或自动转换的结果。
我目前的解决方案是将引擎的数据路径设置为java工作目录。
修改后的init:
// COM-Init
OpenDSS.IDSS DSS = ClassFactory.createDSS();
DSS.dataPath(System.getProperty("user.dir"));
这意味着OpenDSS数据的任何导出都将转储到java工作目录中。不是最好的解决方案,但它的工作原理。我可能只是稍后在程序中清理它。
编辑:我得到了开发者的确认。启动时,引擎会尝试找出它的工作目录应该是什么并设置...在进程级别。为什么它逃脱了我。我不知道任何需要它的编程语言,因为操作系统已经处理了这个...除此之外我没有看到任何理由在引擎中包含自动化过程...无论如何,除非开发人员改变了这一点,否则任何使用java界面的人都会继续存在这个问题。
我会将此标记为解决方案,直到我收到有关此更改的消息......