der*_*ann 21 java eclipse exception file filereader
当我运行应该从Eclipse中的文件读取的Java应用程序时java.io.FileNotFoundException,即使文件位于正确的目录中,我也会得到一个.我可以从命令行编译并运行应用程序就好了; 该问题仅发生在Eclipse中,具有多个项目和应用程序.我是否需要在运行配置或构建路径中更改设置以使其正确查找文件?
Ste*_*n C 30
问题很可能是您的应用程序使用的是相对路径名.正如@BalusC所说,相对路径名可能会有问题.但IMO,当他说"你永远不应该在java.io的东西中使用相对路径"时,他走得太远了.
当应用程序使用(例如)FileInputStream(File)构造函数打开文件时,相对路径名相对于"当前目录"在javadoc for中描述的过程中进行解析File.getAbsolutePath().
[...]否则,此路径名将以系统相关的方式解析.在UNIX系统上,通过将相对路径名解析为当前用户目录,使其成为绝对路径名.在Microsoft Windows系统上,通过将路径名解析为路径名所指定的驱动器的当前目录(如果有),使相对路径名成为绝对路径名; 如果没有,则针对当前用户目录解析.
所以我们立即看到"当前目录"的概念在Windows和UNIX平台上有不同的细微差别.第二个问题是,在纯Java中,您无法明确地找出当前目录是什么,并且您当然无法使用纯Java为当前JVM更改它.(当JVM启动时,"user.dir"系统属性被设置为当前目录,但没有什么能阻止应用程序更改属性,因此您无法完全依赖它.此外,更改"user.dir"只会更改解决空路径的方式,而不是一般的相对路径.)
那么你应该怎么做呢?
一种选择是使用绝对路径名来引用文件.这在(几乎)所有情况下都是可靠的,但如果用户必须输入路径名,或者如果您需要避免硬连线(或配置)的绝对路径名,则使用绝对路径名可能会有问题.
第二种选择是使用类路径相对路径名并找到相对于应用程序安装目录的文件.如果您需要这样做,这可以工作,但如果您需要传递File给某个库方法,则会出现问题.如果您正在尝试查找用户的应用程序首选项,它也无济于事.(通常,将用户首选项放入安装目录是错误的......)
第三个选项是相对于从其他地方获得的某个绝对目录命名文件; 例如new File(System.getProperty("home.dir"), "foo/bar");.
最后一个选项是使用相对路径名,并假设用户知道当前目录是什么.对于用户从命令行运行的许多应用程序,这是正确的解决方案.
在Eclipse的特定情况下,有一个简单的解决方案.转到用于启动应用程序的"运行配置",打开"参数"选项卡,然后单击"其他"单选按钮.然后输入绝对路径名作为已启动应用程序的工作目录.启动子JVM时,它将指定的工作目录作为其当前目录.
小智 8
另一种选择是简单地找出"当前路径"指向您环境中的目录 - 无论是什么.一旦你弄清楚,你可以从那里选择你的解决方案.也许这是使用适当的相对路径到您的文件的位置或重新定位文件.
File testFile = new File("");
String currentPath = testFile.getAbsolutePath();
System.out.println("current path is: " + currentPath);
Run Code Online (Sandbox Code Playgroud)
在Eclipse中创建默认Java应用程序时,您将获得以下目录结构:
./ProjectName/ - 根目录
./ProjectName/bin/ - 输出目录,包含.class文件
./ProjectName/src/ - 源目录,包含.java文件
如果您的应用程序请求"./data.txt",它将相对于根目录搜索它.这是"工作目录",可以根据Martin上面的回复在参数选项卡中进行配置.
你说它可以从命令行工作吗?这可能是因为您在运行java二进制文件时位于bin或src文件夹中.在这种情况下,工作目录是命令提示符当前所在的目录.例如,如果你进入/ src /目录,javac *.java然后从那里运行文件,它将搜索/ src /目录中的"./data.txt".如果你进入/ bin /目录并从那里运行你的应用程序,它将查找相对于/ bin /目录的文件.