【问题标题】:Java: File creation in the directory of the .jar-file with Files.write()Java:使用 Files.write() 在 .jar 文件的目录中创建文件
【发布时间】:2018-04-02 08:56:22
【问题描述】:

我正在尝试制作一个在 jar 文件目录中创建文本文件的程序。为此,我使用类 Files:

    Files.write(Paths.get("Test.txt"), "foo.txt".getBytes(), StandardOpenOption.CREATE);

我注意到,当我导出程序并通过键入 java -jar Program.jar 从控制台启动它时,Test.txt 文件所在的目录是created 取决于我从中启动它的目录。

例子:

Program.jar 位于 ~/Desktop 中。

  1. 我在默认目录 ~(主目录)中启动终端。我输入 java -jar Desktop/Program.jar。 ---> Test.txt 在~中创建。

  2. 我在默认目录下启动终端并输入 cd Desktop 然后 java -jar Program.jar ---> Test.txt 在 ~/Desktop 中创建。

我认为原因是 Paths.get() 调用 FileSystems.getDefault() 将终端目录作为程序的“根”返回。 当我在桌面上启动一个使用与上述相同方法创建文件的 GUI 应用程序时,该文件也在主目录中创建,我认为这可能是因为双击命令 java-jar ~/Desktop /GUIProgram.jar 被调用。

我的想法对吗?我可以做些什么来实现在与程序相同的目录中创建文件的目标?最后,我想要一个 GUI 应用程序,所以它不是始终使用终端和 cd 到桌面目录的解决方案。我是否必须使用另一个类进行 I/O 操作?我很乐意继续使用 Files,因为它非常简单和简短。

提前感谢您的帮助!

【问题讨论】:

  • 你检查this了吗?

标签: java file input output nio


【解决方案1】:

正如this question 中解释的那样,您可以通过一些奇怪的操作找到您的 jar 文件的路径:

  String path = Test.class.getProtectionDomain().getCodeSource().getLocation().getPath();
      String decodedPath = URLDecoder.decode(path, "UTF-8");

找到 jar 文件的路径后,您可以将此路径作为 Paths.get 方法的第一个参数传递:

Files.write(Paths.get(decodedPath,"Test.txt") , "foo.txt".getBytes(), StandardOpenOption.CREATE);

【讨论】:

  • 非常感谢,这对我有帮助:)
  • 没有。 URLDecoder 用于解码表单/URL 键和值,而不是用于 URL 本身,尽管它的名称。正确的机制是将CodeSource.getLocation()返回的URL转换为URI,并围绕它构造一个File
猜你喜欢
  • 1970-01-01
  • 2012-06-25
  • 2012-03-29
  • 2011-06-03
  • 2015-04-24
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
相关资源
最近更新 更多