Java 无法将JSON写入位于Eclipse J2EE项目内的文件

Java 无法将JSON写入位于Eclipse J2EE项目内的文件,java,json,eclipse,servlets,outputstream,Java,Json,Eclipse,Servlets,Outputstream,有个问题,我就是想不出来,即使做了很多研究。新手的麻烦我猜。。。 我在J2EE应用程序中有一个Javaservlet,它获取数据,处理数据,并用GSON编写JSON文件。 其目的是允许javascript从web应用程序获取json文件 例如,如果json文件位于计算机桌面上的某个位置,JavaServlet将找到它并很好地编写它 OutputStream out = new FileOutputStream("C:\\Users\\AM337866\\Desktop\\data.json",f

有个问题,我就是想不出来,即使做了很多研究。新手的麻烦我猜。。。 我在J2EE应用程序中有一个Javaservlet,它获取数据,处理数据,并用GSON编写JSON文件。 其目的是允许javascript从web应用程序获取json文件

例如,如果json文件位于计算机桌面上的某个位置,JavaServlet将找到它并很好地编写它

OutputStream out = new FileOutputStream("C:\\Users\\AM337866\\Desktop\\data.json",false);
writeJsonStream(out, data);
但由于这是一个web应用程序,我不希望该文件存储在计算机上,而且javascript无法获取它

因此,我考虑将其定位在web应用程序项目的根目录中,以便JS能够获取数据。但是servlet再也找不到文件了,所以写操作就不会发生了

OutputStream out = new FileOutputStream("./data.json",false);
我在这里做错了什么,也许我没有使用好的方法在web应用程序项目中的文件上进行编写。甚至不确定这是在J2EE应用程序中存储json的正确方法。
感谢您的帮助。

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

JAR和WAR中的文件作为Java资源定位,Java类加载器可以使用该方法处理这些文件,该方法将InputStream返回给资源。请注意,如果不提供绝对路径,则传递到此方法的路径取决于调用该方法的类的位置,例如,如果类Test.java和Test.json文件与该类位于同一文件夹中,则可以按如下方式打开资源的InputStream:

InputStream input = Test.class.getClassLoader().getResourceAsStream('test.json');
这将使用加载测试类的同一类加载程序查找资源。请注意,这里我们指的是已编译的类,而不是源代码,因此test.json文件必须位于test.class所在的JAR文件中,但通常在编译项目时,所有非Java类的文件都会复制到类路径中,而无需修改


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

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

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

它工作得很好,但一旦部署应用程序,我认为这将不再有效。因此,我想,在WebContent的根目录下存储Json文件是否正确?

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

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

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


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

只有当您正在搜索的文件不在WAR文件中的JAR中时,这才有效。访问此类资源的通常方法是定义一个可配置的位置,即一个文件夹来存储和检索它。您可以将其视为暂存区或临时文件夹,具体取决于数据应在其中停留的时间。EmirCalabuch您的意思是,如果我生成WAR文件来部署应用程序,这将不起作用?那么data.json应该位于Java资源中吗?谢谢你的帮助!