2010-07-22 84 views
8

我试图编写一个程序来通过args读取文本文件,但是当我运行它时,它总是说即使我将它放在与运行的main.java相同的文件夹中也找不到该文件。 有谁知道解决我的问题或阅读文本文件的更好方式?如何传递文本文件作为参数?

+0

我假设如果输入作为一个程序参数传递,你想通过任意输入程序。那是对的吗? – 2010-07-22 14:50:10

+0

呃不是真的。你在谈论方法或功能吗?我谈论作为一个类im传递参数,当我运行主要方法它应该读取文本文件,但它不。我的代码是Scanner sc1 = new Scanner(new File(args [0]));调试时甚至无法通过这条线。 – Victor 2010-07-22 15:17:32

回答

8

请勿在java.io.File中使用相对路径。

它将成为相对于当前工作目录而言,它取决于如何运行应用程序,而应用程序又不能从应用程序内部控制。这只会导致便携性的麻烦。如果从Eclipse内部运行它,路径将相对于/path/to/eclipse/workspace/projectname。如果从命令控制台内部运行它,它将相对于目前已打开的文件夹(即使通过绝对路径运行代码!)。如果通过双击JAR来运行它,它将相对于JAR的根文件夹。如果你在网络服务器上运行它,它将是相对于/path/to/webserver/binaries。等等。

总是使用绝对路径java.io.File,没有任何借口。

为了获得最佳可移植性和减少绝对路径头痛,只需将文件放置在运行时类路径覆盖的路径中(或将其路径添加到运行时类路径中)。这样,您可以通过Class#getResource()Class#getResourceAsStream()获取文件。如果它与当前类位于相同的文件夹(包)中,那么它已经在类路径中。要访问它,只是做:

public MyClass() { 
    URL url = getClass().getResource("filename.txt"); 
    File file = new File(url.getPath()); 
    InputStream input = new FileInputStream(file); 
    // ... 
} 

public MyClass() { 
    InputStream input = getClass().getResourceAsStream("filename.txt"); 
    // ... 
} 
+0

您可以在Eclipse中指定工作目录。它位于“run as”下的对话框中。这是一种使用相对路径的方式,在eclipse中仍然可以获得合理的行为。 – 2010-07-22 17:17:37

+0

的确,总会有解决方法和ducktapes,但是当真的有更好的方法时,你真的不希望让你的应用程序永远依赖于它。 – BalusC 2010-07-22 17:35:30

1

尝试给出文件名的绝对路径。

此外,发布代码,以便我们可以看到你正在尝试的是什么。

+0

它不能通过这一行: 扫描仪sc1 =新扫描仪(新文件(args [0]));并且我通过我的文本文件作为第一个参数 – Victor 2010-07-22 15:16:03

+0

结合行可以帮助缩短代码并可能提高性能(速度),但在调试时,它有助于分解(即,不在构造函数中嵌入构造函数)。 创建一个File对象,看看这是否是程序跳转的地方。如果不是,则将File对象传递给Scanner(在一个单独的行中),并查看抛出哪种类型的错误。 – chimeracoder 2010-07-22 15:28:28

0

如果您使用的是Eclipse(或类似的IDE),则会出现问题,因为您的程序是从实际源所在的几个目录运行的。尝试在项目树中将文件上移一个或两个级别。

查看更多详情this question

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.") 

    } 

} 

,如果你读到类加载器,它将帮助。

0

当您在Java中打开一个带有相对文件名的文件(并且一般而言)时,它将相对于工作目录打开它。

你可以找到使用

String workindDir = new File(".").getAbsoultePath() 

请确保您从正确的目录下运行程序的进程的当前工作目录(或更改文件名,使其相对于你在哪里运行它来自)。

+0

当前工作目录也可通过系统属性“user.dir”获得。 – 2010-07-22 14:47:11

0

最简单的解决方案是创建一个新的文件,然后看到输出文件。这是放置输入文件的正确位置。

相关问题