【问题标题】:Can't write JSON to file located inside Eclipse J2EE Project无法将 JSON 写入位于 Eclipse J2EE 项目内的文件
【发布时间】:2015-06-15 20:24:10
【问题描述】:

有一个问题,我就是想不通,即使有很多研究。新手有点麻烦我猜... 我在 J2EE 应用程序中有一个 Java Servlet,它获取数据,处理它,并用它(使用 GSON)编写一个 JSON 文件。 目的是允许 javascript 从 Web 应用程序中获取该 json 文件。

如果 json 文件位于计算机的某个位置(例如桌面),java servlet 会找到它并很好地编写它。

OutputStream out = new FileOutputStream("C:\\Users\\AM337866\\Desktop\\data.json",false);
writeJsonStream(out, data);

但由于这是一个网络应用程序,我不希望该文件存储在计算机上,另外,javascript 将无法获取它。

所以我想把它放在 web-app 项目的根目录下,这样 JS 就可以获取数据。但随后 servlet 无法再找到该文件,因此不会发生写入。

OutputStream out = new FileOutputStream("./data.json",false);

我在这里做错了,也许我没有使用好的方法在 web-app 项目中的文件上写入。甚至不确定这是在 J2EE 应用程序中存储 json 的正确方法。 感谢您的帮助。

【问题讨论】:

    标签: java json eclipse servlets outputstream


    【解决方案1】:

    Web 应用程序存档(或 WAR)中的文件无法通过它们的磁盘路径定位,原因有两个:第一个是它们被压缩,因此正常路径无法指向它们,第二个是它们的实际位置zip 文件可能因安装而异,因此固定路径并不好,因为它会经常更改。

    JAR 和 WAR 中的文件位于 Java 资源,可以由 Java 类加载器使用 getResourceAsStream() 方法处理,该方法将 InputStream 返回到资源。请注意,如果您不提供绝对路径,则传递给此方法的路径取决于调用该方法的类的位置,例如,如果您有一个类 Test.javatest.json 位于同一个文件中文件夹作为类,您可以像这样为资源打开InputStream

    InputStream input = Test.class.getClassLoader().getResourceAsStream('test.json');
    

    这会使用加载Test 类的相同类加载器来查找资源。请注意,这里我们指的是 compiled 类,而不是源代码(因此 test.json 文件必须在 Test.class 所在的 JAR 文件中,但是通常在编译项目时所有文件不是 Java 类的会直接复制到类路径中而不做修改。

    请注意,Java 类加载器是一个复杂的主题,因为一个应用程序可以有多个类加载器。多线程使事情变得更加复杂。

    【讨论】:

      【解决方案2】:

      好的,我想出了如何让servlet找到json文件并编写它。

       String path = this.getServletContext().getRealPath("/");
       OutputStream out = new FileOutputStream(path+"\\data.json",false);
      

      它工作正常,但是一旦应用程序被部署,我认为它不会再工作了。所以这让我想,在 WebContent 的根目录中存储 Json 文件是否正确?

      【讨论】:

      • 这仅在您搜索的文件不在 WAR 文件中的 JAR 中时才有效
      • 访问此类资源的常用方法是定义一个可配置的位置(文件夹)来存储和检索它。您可以将其视为暂存区或临时文件夹,具体取决于数据应在此处保留多长时间。
      • EmirCalabuch 所以你的意思是如果我生成一个 WAR 文件来部署应用程序,这行不通?那么 data.json 应该位于 Java 资源中吗?感谢您的帮助!
      【解决方案3】:

      我最喜欢访问此类资源的方式是定义一个可配置的位置(一个文件夹)来存储和检索它。您可以将其视为暂存区域或临时文件夹,具体取决于数据应在此处保留多长时间。

      有很多方法可以定义它。例如,我通常使用 spring 来注入可配置的位置。

      因为它可以根据环境(DEV、TEST、PROD 等...)进行配置,所以我建议使用绝对路径,就像您在代码示例中所做的那样。相对路径(即相对于您的安装)只会增加混淆并降低代码的可移植性(单元测试、webapp、可运行 jar 等......)

      类路径资源也很有用,但我认为这不符合您在这种特定情况下的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 2021-02-19
        • 2021-04-15
        • 1970-01-01
        相关资源
        最近更新 更多