【问题标题】:mkdirs() works when executing from JAVA but not from MATLAB, why?mkdirs() 从 JAVA 执行时有效,但不能从 MATLAB 执行,为什么?
【发布时间】:2014-01-24 03:24:27
【问题描述】:

我对从 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() 处终止,因此永远不会创建目录。我之前多次成功使用mkdirs()mkdir(),所以,我怀疑问题存在于MATLAB。你知道是什么原因吗?

堆栈跟踪:

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);

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

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

【问题讨论】:

  • 它正在抛出异常,不是吗?它的堆栈跟踪是什么(使用e.printStackTrace() 而不是System.out.println("Some Error"))?
  • @watery,是的,它正在引发异常。让我回复你。
  • 什么异常?我的水晶球说 matlab 以不同的用户身份运行并且没有正确的权限。
  • @jtahlborn 我怎么知道它抛出了哪个异常?我刚刚(为简单起见)创建了带有异常的 try/catch。
  • 查看我的编辑评论。打印当前目录可能是值得的,只是为了确保在您期望的位置创建文件夹。

标签: java matlab input mkdir mkdirs


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复。我怀疑使用绝对路径是否是个好主意,因为我的程序应该在许多不同的计算机上跨平台使用。
  • @SteewDK 您应该能够以某种方式获取当前目录(我不熟悉 Java I/O API)并将其添加到您的路径中。
【解决方案2】:

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

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

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

解决方案:

  1. 稍微硬核一点,从 Java 代码中挖掘出 JAR 文件的目录,以便将其添加到路径 like so 的前面。
  2. 如果您可以依靠当前 MATLAB 文件夹作为满足您需求的良好参考,请将 cwd 返回的值传递到您的 Java 函数中。
  3. 如果 MATLAB 的默认路径相关,您可以假设您的 Java 代码将该目录作为当前目录,您可以通过调用 System.getProperty("user.dir") 获得该目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2018-05-18
    • 2010-10-26
    • 2011-06-06
    相关资源
    最近更新 更多