我试图编写一个程序来通过args读取文本文件,但是当我运行它时,它总是说文件找不到,即使我把它放在与我运行的main.java相同的文件夹中。 有谁知道我的问题的解决方案或更好的阅读文本文件的方法?
答案 0 :(得分:8)
请勿在{{1}}中使用相对路径。
它将变为相对于当前工作目录,这取决于您运行应用程序的方式,而应用程序又无法从应用程序内部进行控制。这只会导致便携性问题。如果从Eclipse内部运行它,则路径将相对于java.io.File
。如果从命令控制台内部运行它,它将相对于当前打开的文件夹(即使您按绝对路径运行代码!)。如果通过双击JAR来运行它,它将相对于JAR的根文件夹。如果您在网络服务器中运行它,它将相对于/path/to/eclipse/workspace/projectname
。等等。
始终使用/path/to/webserver/binaries
中的绝对路径,没有任何借口。
为了获得最佳的可移植性和减少绝对路径的麻烦,只需将文件放在运行时类路径覆盖的路径中(或将其路径添加到运行时类路径)。这样,您可以按Class#getResource()
获取文件,或按Class#getResourceAsStream()
获取内容。如果它与当前类位于同一文件夹(包)中,则它已经在类路径中。要访问它,只需执行:
java.io.File
或
public MyClass() {
URL url = getClass().getResource("filename.txt");
File file = new File(url.getPath());
InputStream input = new FileInputStream(file);
// ...
}
答案 1 :(得分:1)
尝试给出文件名的绝对路径。
另外,发布代码,以便我们可以看到您正在尝试的内容。
答案 2 :(得分:0)
如果您正在使用Eclipse(或类似的IDE),则问题产生于您的程序从实际源所在的几个目录运行。尝试在项目树中将文件向上移动一两级。
查看this question了解更多详情。
答案 3 :(得分:0)
如果您将文件和使用它的类放在同一个包中,可以使用:
Class A {
void readFile (String fileName) {
Url tmp = A.class.getResource (fileName);
// Or Url tmp = this.getClass().getResource (fileName);
File tmpFile = File (tmp);
if (tmpFile.exists())
System.out.print("I found the file.")
}
}
如果您阅读有关类加载器的内容,将会有所帮助。
答案 4 :(得分:0)
当您使用Java(通常)打开具有相对文件名的文件时,它会相对于工作目录打开它。
您可以使用
找到流程的当前工作目录String workindDir = new File(".").getAbsoultePath()
确保从正确的目录运行程序(或更改文件名,使其与您运行它的位置相对)。
答案 5 :(得分:0)
最简单的解决方案是创建一个新文件,然后查看输出文件的位置。这是输入文件的正确位置。