搞砸了文件IO

时间:2014-02-05 12:20:28

标签: java file file-io com com4j

我显然是这么做的,并且不知道如何。或者为什么......或者究竟是什么。

好的,这里是设置

我使用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引擎的问题。无论有没有,有一个简单的方法可以解决这个问题。

1 个答案:

答案 0 :(得分:0)

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

Java没有注意到这一点。也许那是因为java需要通过它自己的界面来发生变化才能注意到它。不知道。

我还在调查引擎在初始化时强制默认工作目录的原因。这可能是引擎中的硬编码或自动转换的结果。

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

修改后的init:

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

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

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

无论如何,除非开发人员改变了这一点,否则任何使用java界面的人都会继续存在这个问题。

我会将此标记为解决方案,直到我收到有关此更改的消息......