如何使jar写入/读取外部文件



我的jar用于读取和写入.json文件。为此,我决定使用一个外部文件来读取和写入。

我的 jar 是通过 docker-compose up 创建的,并在/a/b/c/d/app 中运行.jar

我想与之交互的 .json 文件位于/homeDir/Documents/file.json 中

JSONObject aJQLs = new JSONObject(IOUtils.toString(new FileInputStream("/Documents/file.json"), "UTF-8")); 

但是,我不断得到FileNotFoundException。

我认为这就像输入文件的绝对路径一样简单。

我收到以下错误日志

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'jiraAutomationController' defined in URL [jar:file:/app.jar!/BOOT-
INF/classes!/com/company/jiraautomation/controller/JiraAutomationController.class]: Instantiation of bean 
failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate 
[com.company.jiraautomation.controller.JiraAutomationController]: Constructor threw exception; nested 
exception is java.io.FileNotFoundException: /Documents/file.json (No such file or directory)

jar 是否可以按照我想要的方式与外部文件进行交互?

运行 jar 时我对文件路径的理解有问题吗?

我在没有 Spring Boot 的情况下做了一个快速测试,只是普通的 Java,看看我的路径逻辑是否错误,但它工作正常。

任何见解将不胜感激

由于您是从 docker 容器内部运行 jar,因此它无法访问主机系统上的任何文件,因为 docker 容器在与主机操作系统隔离的情况下运行。

但是,您可以将卷从主机系统挂载到 docker 容器。

Docker 主机挂载卷

语法:/host/path:/container/path

主机路径可以定义为绝对路径或相对路径。

例:

version: '3'
services:
app:
image: nginx:alpine
ports:
- 80:80
volumes:
- /var/opt/my_website/dist:/usr/share/nginx/html

在您的情况下,您可以在相关服务docker-compose.yml中添加以下内容 -

volumes:
- /homeDir/Documents:/user/local/Documents

现在,主机操作系统上的/homeDir/Documents将挂载到容器上的/user/local/Documents上(/user/local/Documents此目录将由 docker 自动创建(。在此之后,修改您的 java 代码以将文件从内部的位置读取到容器,即/user/local/Documents/file.json(如卷中定义(,如下所示 -

JSONObject object = new JSONObject(IOUtils.toString(new FileInputStream("/user/local/Documents/file.json"), "UTF-8")); 

现在,程序应该能够使用 docker 卷从主机操作系统读取文件。

将路径更改为

"file:///Documents/file.json"

然后尝试。

相关内容

  • 没有找到相关文章

最新更新