如何从可运行的JAR中读取/写入外部数据资源?

时间:2012-07-15 22:51:37

标签: java command-line jar resources

我想从命令行运行MyRunnableJar.jar。它需要从file_[1-4].dat读取,进行一些处理,然后写入file_5.dat。所有上述数据文件都在文件系统中的MyRunnableJar.jar附近。例如:

  • super_directory/
    • MyRunnableJar.jar
    • data_resources/
      • file_1.dat
      • file_2.dat
      • file_3.dat
      • nested_data_directory/
        • file_4.dat
        • file_5.dat

MyRunnableJar.jar是由Eclipse的Export功能创建的。)

我想以这种方式做事的原因是因为在我的小笔记本电脑上运行应用程序的计算成本太高。相反,我想把它放在一个远程服务器上(包含它必须访问的所有大数据文件)并在那里运行它。

问题是,我无法弄清楚如何显示那些数据文件所在的可运行JAR。如果需要,数据文件当然可以移动。但是,将它们保留在JAR中是不可取的,因为如果我想更改一些应用程序代码,我将不得不重新传输整个JAR,如果它包含数据文件则会非常大。此外,如果它实际上在我的JAR中,我将无法写入file_5.dat

我知道在Stack Exchange上有很多类似的问题,但在每种情况下,问题在某些重要方面都略有不同。


编辑:

  • 请参阅接受的答案。
  • 另请注意,Andre的解决方案(在评论中解释)也有效,因为在我的情况下,JAR和数据文件将始终在文件系统中相对于彼此处于相同的位置。

1 个答案:

答案 0 :(得分:1)

您真正需要做的是确定.jar文件所在的目录,无论System.property("user.dir");返回什么或执行MyRunnableJar.jar的位置。您不希望假设您当前与MyRunnableJar.jar位于同一目录中,如果您不是,则无法计算 relative 目录,因为您不知道 relative 到那个.jar的地方。

以下代码段将为您执行此操作:

return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());

MyClass类替换为main

然后,您可以使用它来构建要读取的目录的路径。这就是那里的蛋糕。