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

Java 如何使jar写入/读取外部文件,java,spring,spring-boot,jar,path,Java,Spring,Spring Boot,Jar,Path,我的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"), "

我的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时,我对文件路径的理解是否有问题

我在没有SpringBoot的情况下做了一个快速测试,只是用普通的Java来看看我的路径逻辑是否有误,但它工作得很好

任何洞察都将不胜感激

改变你的人生道路

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

然后再试。

因为您是从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卷从主机操作系统读取文件。

您可以分享如何访问此自动化吗?\u jql.json自动化\u jql.json与file.json相同。很抱歉,我会编辑它。