0

我对从 MATLAB 执行的 JAVA 应用程序不走运。简而言之,我有以下代码:

try {
        dir = new File("Patients/Patient" + patientNumber + "/Meals");  
        dir.mkdirs(); 
        .... more code goes here
} catch (Exception e) {
        System.out.println("Some Error");   

出于某种原因,我不知道为什么,当从 JAVA 主方法执行时,这段代码运行得很好。但是,在 MATLAB 中,这段代码不起作用。它终止于dir.mkdirs(),因此永远不会创建目录。我之前多次使用成功,所以我怀疑MATLAB中存在问题mkdirs()mkdir()你知道是什么原因吗?

堆栈跟踪:

e.printStackTrace();

返回以下内容:

java.io.FileNotFoundException: Patients\Patient1\Meals\meal0.csv (The system cannot find the path specified.)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileWriter.<init>(Unknown Source)
at inputOutput.PrintPatientCsv.printMealCsv(PrintPatientCsv.java:57)
at inputOutput.CreatePopulation.createpopulation(CreatePopulation.java:54)
at functionality.FactoryModel.loadData(FactoryModel.java:100)

最后三行是未创建目录的产物。但是,我不确定上面代码中前 4 行的含义。

节目详情

我的 Java 程序是在一个.jar文件中创建的。该.jar文件位于:
C:\Users\myName\program\binJava

我的 matlab(我从中执行.jar文件)文件位于:
C:\Users\myName\program\matlab

在我的 MATLAB 中,我键入以下内容:

clear all
javaaddpath('..\binJava\myFile.jar')
import functionality.*;
import domain.*;
import test.*;
import inputOutput.*;
function.MyFunction(1,2,3);

导入语句的原因是我的程序构建到 4 个不同的包中。

*更新:* 我刚刚发现,如果我按照 lnunno 的建议创建绝对目录,程序就可以工作。但这仍然不能解决问题。

4

2 回答 2

0

MATLAB 和它托管的 Java 虚拟机 (JVM) 是在同一进程下同时运行的两种不同的野兽。因此,它们对当前工作目录有不同的概念。具体来说,MATLAB 的当前工作目录从加载时显示的默认目录开始,并将遵循cd您使用 GUI 或命令行执行的任何命令。JVM 的当前工作目录是java启动二进制文件的目录。由于 MATLAB 从其默认目录执行此操作,因此该目录是 JVM 将考虑的当前目录,并且永远不会改变。

在 MATLAB 中获取工作目录使用pwd. 在 Java 中(在 JavaSE JVM 下)使用System.getProperty("user.dir").

不幸的是,在您的情况下,由于您希望使用相对于 Java 代码所在位置的路径,因此上述任何一个都不会使用。

解决方案:

  1. 稍微硬核一点,从 Java 代码中挖掘出 JAR 文件的目录,这样您就可以像这样将它添加到您的路径中。
  2. 如果您可以依靠当前的 MATLAB 文件夹作为满足您需求的良好参考,请将返回的值cwd传入您的 Java 函数。
  3. 如果 MATLAB 的默认路径是相关的,您可以假设您的 Java 代码将该目录作为当前目录,您可以通过调用System.getProperty("user.dir").
于 2014-06-18T12:31:44.483 回答
0

我没有评论所需的代表,但是您是否尝试过使用绝对路径?

java.io.FileNotFoundException: Patients\Patient1\Meals\meal0.csv (The system cannot find the path specified.)

意味着 java 无法找到您使用相对路径指定的文件。我不确定当您从 Matlab 调用它时它会如何变化,但也许您可以使用绝对路径指定此目录所在的位置并对其进行测试并使用堆栈跟踪报告回来。

于 2014-01-06T17:14:59.790 回答