Java程序正在从system32文件夹加载,而不是从它所在的文件夹加载

Java程序正在从system32文件夹加载,而不是从它所在的文件夹加载,java,windows,Java,Windows,我在Windows7上用Java编写了桌面程序,并在启动时通过在HKEY\U CURRENT\U User/Software/Microsoft/Windows/CurrentVersion/Run分支中向注册表写入jar文件(类似于C:\Users\User\Documents\My App.jar)的路径将其挂起。当我的程序与Windows一起加载时,它必须加载与程序位于同一文件夹中的某些文本文件: File f = new File("text.txt"); // without full

我在Windows7上用Java编写了桌面程序,并在启动时通过在HKEY\U CURRENT\U User/Software/Microsoft/Windows/CurrentVersion/Run分支中向注册表写入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文件夹和文本文件中。我做错了什么?

我的理论是:如果你通过传统的安装程序安装了Java for Windows,那么除了你告诉它放置它的地方(通常是
Java\u HOME
),安装程序会在
system32
目录中放置一个
Java.exe
,因此当你启动JVM时,
system32
是工作目录,它将在其中查找具有相对路径名的文件,如您提供的文件

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


作为结束语——与您的问题无关——我讨厌Java在Windows上这样做,并立即删除
Java.exe的副本,然后设置
路径
,以确保我想要的版本是按需执行的版本。

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

看看这个问题:


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

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

就像这样: 一,

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



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

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


实际的解决方案是调整CurrentVersion\Run注册表项,以便为应用程序指定默认的工作文件夹。签出:

Java for windows在system32目录中删除一个Java.exe。不,它在程序文件/Java/jdk#/bin中。它也会将所有二进制文件安装到传统的“Java_HOME”空间中,但它也会将
Java.exe
的副本放入
system32
中。这是真的,我认为这就是为什么当它在启动时启动时,你会在
system32
中作为一个工作目录。那么,为什么从资源管理器中懒洋洋地工作是成功的呢?因为它将工作目录设置为你期望的位置。对于您的技术诀窍,添加快捷方式,打开快捷方式属性,您将看到配置工作目录,更改它并启动。您应该根据配置获得不同的文件路径。将文件放在system32或其他地方不适合我…@diegocnascemento是的,您是对的。不知道。所以,有一段时间我决定把快捷方式放在自动运行文件夹中。稍后,我将尝试从问题的解决方案获取Java中的当前工作目录。如果我做得对,这个链接对我没有帮助。可能是因为jar,而不是EXE。您是如何调整CurrentVersion\Run键的?您可能还想尝试显式运行javaw.exe来启动JAR(而不是依赖于文件关联)?尝试一下。。。