2

我在 Windows 7 上用 Java 编写了桌面程序,并在启动时通过在HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion中将 jar 文件的路径(类型 C:\Users\User\Documents\My App.jar)写入注册表来挂起它/运行分支。当我的程序与 Windows 一起加载时,它必须加载一些与程序放在同一文件夹中的文本文件:

File f = new File("text.txt"); // without full path to file
if(!f.exists())
    JOptionPane.showMessageDialog(null, "File not found: " + f.getAbsolutePath());

但不能这样做,我收到消息:“找不到文件:C:\Windows\system32\text.txt”。该程序似乎也分别位于system32文件夹和文本文件中。我做错了什么?

4

4 回答 4

2

我的理论:如果您通过传统安装程序安装了 Java for Windows,除了您告诉它放置它的位置(规范地,JAVA_HOME)之外,安装程序会将 ajava.exe放入system32目录中,因此很可能当您启动 JVM 时启动,system32是工作目录,它将在其中查找具有您提供的相对路径名称的文件。

最简单的解决方案是在代码中绝对指定文本文件的路径。我还建议java.exe在您的注册表项中指定完整路径(我猜现在它只是java.exe没有路径),以便您可以保证您正在运行哪个版本;如果您安装了多个 Java 版本,那么只有最近安装的一个版本才会有java.exe并且system32没有合格的路径,我猜这就是您得到的版本,因为那时PATH可能会很少。

作为结束 - 与您的问题无关 - 点,我讨厌 Java 在 Windows 上执行此操作并java.exe立即擦除该副本,然后设置PATH以确保我想要的版本是按需执行的版本。

于 2013-09-12T18:23:50.027 回答
0

我认为@Omaha 的答案是描述正在发生的事情(您正在从 system32 目录启动 java.exe - JRE 安装程序将 java.exe 的副本放在 system32 中,以使用户更容易访问)。

针对您的情况的实际解决方案是调整您的 CurrentVersion\Run 注册表项,以便它为应用程序指定一个默认工作文件夹。查看:使用注册表启动程序,并更改当前工作目录?

于 2013-09-13T05:15:34.230 回答
0

您需要获取当前工作目录并将其用作文件绝对路径的一部分。

看看这个问题:Getting the Current Working Directory in Java

另一种解决方法是读取您描述的此注册表项并使用此信息从所需路径读取文件 -使用 Java 读取/写入 Windows 注册表

于 2013-09-12T18:24:25.950 回答
0

您所指的路径是工作目录,而不是安装应用程序的位置。就像如果你给它一个快捷方式,你可以改变工作目录,它会改变你得到的结果。但是当您将其自动启动时,可能是 Windows 将其设置为工作目录。

像这样: 使用注册表启动程序,并更改当前工作目录? 1

您可以尝试使用注册表中的命令行参数将文件目录传递给您的应用程序。


1 - 这可能不会为您解决问题,您似乎没有,这只是一个解释

于 2013-09-12T18:32:54.697 回答