Java程序从system32文件夹加载,而不是从放置它的文件夹加载

时间:2013-09-12 18:17:27

标签: java windows

我在Windows 7上用Java编写了桌面程序,并在启动时通过在 HKEY_CURRENT_USER / Software中写入jar文件的路径(C:\ Users \ User \ Documents \ My App.jar)的路径来挂起它/ Microsoft / Windows / CurrentVersion / Run 分支。当我的程序加载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 个答案:

答案 0 :(得分:2)

我的理论:如果您通过传统安装程序安装了Java for Windows,那么除了您告诉它放置它的地方(规范地JAVA_HOME)之外,安装程序会在java.exe中删除system32 {1}}目录,因此当您在启动时启动JVM时,system32可能就是工作目录,而且它将查找具有相对路径名的文件,例如您提供的文件。< / p>

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

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

答案 1 :(得分:0)

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

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

其他解决方法是阅读您描述的此注册表项,并使用此信息从所需路径中读取文件 - read/write to Windows Registry using Java

答案 2 :(得分:0)

您引用的路径是工作目录,而不是安装应用程序的位置。就像你给它做了一个shorcut,你可以改变工作目录,它会改变你得到的结果。但是当你把它自动启动时,可能是windows将其设置为工作目录。

喜欢那样: Use registry to startup a program, and also change the current working directory? 1

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


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

答案 3 :(得分:0)

我认为@Omaha的答案是描述正在发生的事情(您从system32目录启动java.exe - JRE安装程序在system32中放置了一个java.exe副本,以方便用户访问)。 / p>

您的情况的实际解决方案是调整CurrentVersion \ Run注册表项,以便为应用程序指定默认的工作文件夹。查看:Use registry to startup a program, and also change the current working directory?