遇到了问题,即使有很多研究,我也无法弄明白。我觉得新手有点麻烦...... 我在J2EE应用程序中有一个Java Servlet,它可以获取数据,处理它,并用它来编写JSON文件(使用GSON)。 目的是允许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的正确方法。 谢谢你的帮助。
答案 0 :(得分:0)
Web应用程序存档(或WAR)中的文件无法通过其磁盘路径找到,原因有两个:第一个是它们是压缩的,因此正常路径不能指向它们,第二个是实际位置zip文件可能因安装而异,因此固定路径不好,因为它会经常更改。
JAR和WAR中的文件位于 Java资源中,可以使用getResourceAsStream()方法由Java类加载器处理,该方法向资源返回InputStream
。请注意,传递给此方法的路径取决于在不提供绝对路径的情况下从中调用方法的类的位置,例如,如果您有类Test.java
和test.json
文件与该类位于同一文件夹中,您可以为此资源打开InputStream
:
InputStream input = Test.class.getClassLoader().getResourceAsStream('test.json');
这将使用加载Test
类的相同类加载器查找资源。请注意,这里我们引用编译的类,而不是源代码(因此test.json
文件必须位于Test.class
所在的JAR文件中,但通常是在项目中编译所有非Java类的文件都不会被修改复制到类路径。
请注意,Java类加载器是一个复杂的主题,因为应用程序可以有多个类加载器。多线程使事情进一步复杂化。
答案 1 :(得分:0)
好的,我想到了如何使servlet找到json文件并编写它。
String path = this.getServletContext().getRealPath("/");
OutputStream out = new FileOutputStream(path+"\\data.json",false);
它工作正常,但一旦部署了应用程序,我认为不再适用。这让我觉得,它是在WebContent的根目录下存储Json文件的正确方法吗?
答案 2 :(得分:0)
我最喜欢的访问此类资源的方法是定义一个可配置的位置(文件夹)来存储和检索它。您可以将其视为暂存区域或临时文件夹,具体取决于数据应保留多长时间。
有很多方法可以定义它。例如,我通常使用spring来注入可配置的位置。
由于它可以根据环境(DEV,TEST,PROD等)进行配置,我建议使用绝对路径,就像在代码示例中一样。相对路径(即相对于您的安装)只会增加混淆并降低代码的可移植性(单元测试,webapp,可运行的jar等......)
类路径资源也很有用,但我不认为这符合您在这种特定情况下的需求。