我试图编写一个程序来通过args读取文本文件,但是当我运行它时,它总是说即使我将它放在与运行的main.java相同的文件夹中也找不到该文件。 有谁知道解决我的问题或阅读文本文件的更好方式?如何传递文本文件作为参数?
回答
请勿在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");
// ...
}
您可以在Eclipse中指定工作目录。它位于“run as”下的对话框中。这是一种使用相对路径的方式,在eclipse中仍然可以获得合理的行为。 – 2010-07-22 17:17:37
的确,总会有解决方法和ducktapes,但是当真的有更好的方法时,你真的不希望让你的应用程序永远依赖于它。 – BalusC 2010-07-22 17:35:30
尝试给出文件名的绝对路径。
此外,发布代码,以便我们可以看到你正在尝试的是什么。
它不能通过这一行: 扫描仪sc1 =新扫描仪(新文件(args [0]));并且我通过我的文本文件作为第一个参数 – Victor 2010-07-22 15:16:03
结合行可以帮助缩短代码并可能提高性能(速度),但在调试时,它有助于分解(即,不在构造函数中嵌入构造函数)。 创建一个File对象,看看这是否是程序跳转的地方。如果不是,则将File对象传递给Scanner(在一个单独的行中),并查看抛出哪种类型的错误。 – chimeracoder 2010-07-22 15:28:28
如果您使用的是Eclipse(或类似的IDE),则会出现问题,因为您的程序是从实际源所在的几个目录运行的。尝试在项目树中将文件上移一个或两个级别。
查看更多详情this question。
如果你把文件和类相同的包下使用它你可以使用这个:
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.")
}
}
,如果你读到类加载器,它将帮助。
当您在Java中打开一个带有相对文件名的文件(并且一般而言)时,它将相对于工作目录打开它。
你可以找到使用
String workindDir = new File(".").getAbsoultePath()
请确保您从正确的目录下运行程序的进程的当前工作目录(或更改文件名,使其相对于你在哪里运行它来自)。
当前工作目录也可通过系统属性“user.dir”获得。 – 2010-07-22 14:47:11
最简单的解决方案是创建一个新的文件,然后看到输出文件。这是放置输入文件的正确位置。
- 1. 如何将新文本作为参数传递给bat文件?
- 2. 传递文件作为参数浏览
- 3. 传递文件名作为参数
- 4. C:传递文件作为参数
- 5. 如何通过文件作为参数传递给脚本文件
- 6. 如何执行作为sp参数传递的sql文本?
- 7. 传递的内容作为参数传递给标签文件
- 8. 如何将文件作为参数传递给C++?
- 9. 我如何传递文件目录(路径)作为参数?
- 10. 在Angular2中传递一个i18n文本作为组件参数
- 11. Python:如何将文件对象作为函数参数传递给python脚本?
- 12. 如何从Perl中的文本文件传递参数到ARGV
- 13. 传递AES密文作为参数
- 14. 如何通过docker run将本地文件作为参数传递?
- 15. 如何提供一个文件名作为参数传递给shell脚本
- 16. 传递参数文件
- 17. 如何传递一个函数作为上下文参数?
- 18. 如何传递数组作为参数?
- 19. 如何传递函数作为参数?
- 20. 如何从文本文件传递参数到Windows XP批处理文件?
- 21. 如何传递Object作为参数与传递Array作为参数不同?
- 22. 通.apk文件作为参数传递给詹金斯工作
- 23. 如何将整个命令行文本作为参数传递给bash函数?
- 24. 传递数组作为参数到PHP文件
- 25. 从.feature文件传递变量作为数组参数
- 26. 传递一个文件作为函数参数
- 27. 将文本框的值作为参数传递给action? MVC
- 28. 如何从批处理文件传递参数到Perl脚本
- 29. 如何将参数传递到bat文件中的php脚本
- 30. 对象如何作为参数传递?
我假设如果输入作为一个程序参数传递,你想通过任意输入程序。那是对的吗? – 2010-07-22 14:50:10
呃不是真的。你在谈论方法或功能吗?我谈论作为一个类im传递参数,当我运行主要方法它应该读取文本文件,但它不。我的代码是Scanner sc1 = new Scanner(new File(args [0]));调试时甚至无法通过这条线。 – Victor 2010-07-22 15:17:32