java - 简化在 .jar 所在文件夹中打开文件的过程

标签 java file-io java-8

旁边有一个可运行的 jar 文件和 data.txt 文件。 data.txt 可能会动态更改。程序需要读取该文件的内容。我第一次尝试打开文件失败:

new InputStreamReader(getClass().getResourceAsStream("/data.txt"), "UTF-8");

我找到了以下解决方案,但它很复杂并且有点尴尬:

new InputStreamReader(new FileInputStream(new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath()).getParent() + "/data.txt"), "UTF-8");

很难理解这里发生了什么。

我尝试了new File("./data.txt")并且抛出了NPE。

如何以更易读的方式打开与 .jar 文件位于同一文件夹中的 data.txt 文件?

最佳答案

有两种方法可以定位类文件的基本路径,您可能会发现这两种方法都比必要的更复杂。

第一个是您问题中已有的内容:

URL url = MyClass.class.getProtectionDomain().getCodeSource().getLocation();

第二个是

URL url=MyClass.class.getResource("MyClass.class");
if(url.getProtocol().equals("jar"))
    url=((JarURLConnection)url.openConnection()).getJarFileURL();
else url=MyClass.class.getResource("/");// for file: directories

URL您可以获得一个UTF-8Reader:

Reader r = Files.newBufferedReader(Paths.get(url.toURI()).resolveSibling("data.txt"));

关于java - 简化在 .jar 所在文件夹中打开文件的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25647597/

相关文章:

Java Swing 重新打包组件

java - jtable 和自定义组合

java - 用字符串中的 'and' 替换逗号的最后一个实例

java - 在 Java8 中使用 lambda 排序和创建映射

java - 为什么在 java 接口(interface)中使用 this 关键字,它指的是什么?

java - 邮件发送错误 - SMTPAddressFailedException

java - 比较两个使用断言转换为对象的json列表

c++ - 用 C++ 读取文本文件

c - 文件处理程序中不需要的输出(连接文件)

c++ - 如何检查文件是否已被另一个 C++ 应用程序打开?