Java 在portlet中读取.json文件

Java 在portlet中读取.json文件,java,portlet,liferay-6,Java,Portlet,Liferay 6,我想通过portlet读取静态json文件(用于测试) 我已将其放在/json文件夹中。因此,部署portlet时,该文件夹位于\webapps文件夹中。 完整路径:webapps\myPortlet\json\op.json 在processAction方法中- @Override public void processAction(ActionRequest request, ActionResponse response) throws PortletException,

我想通过portlet读取静态json文件(用于测试)

我已将其放在/json文件夹中。因此,部署portlet时,该文件夹位于\webapps文件夹中。 完整路径:
webapps\myPortlet\json\op.json

在processAction方法中-

@Override
public void processAction(ActionRequest request, ActionResponse response)
        throws PortletException, IOException {
    JSONParser parser = new JSONParser();
    try {
            JSONObject jsonObject = (JSONObject) parser.parse(new FileReader
            (request.getContextPath() + "/json/op.json"));

.
.
.
}
我得到了FileNotFoundException


有人能告诉我访问这个文件的正确方法吗

首先,您可以使用一些不错的System.out(但请稍后删除它,这样它就不会污染日志文件)

如果你打印这些信息

System.out.println( "request.getContextPath(): " + request.getContextPath() );
System.out.println( "new File(request.getContextPath()) : " + new File(request.getContextPath()).getAbsolutePath()  );
你会发现一个小小的惊喜。您将从中获得更多信息

System.out.println( "new File() : " + new File().getAbsolutePath()  );
如果你真的需要加载一个静态文件,你应该问问自己为什么要这样做,你会从中得到什么。不要编写一些你以后不需要的东西。也许你能找到一个更好的解决方案——甚至是一个更好的(自动)可测试的解决方案

如果您确实需要静态文件(如图像),可以将其放入类附近的jar中:

@看

如果您需要将内容文件作为某种配置文件,那么您应该重新考虑您的体系结构,并从一些可配置参数(如web.xml)中找到文件的路径


记住:不要建造你不需要的东西。不要把时间浪费在以后要删除的东西上,这些东西集成在软件中。尝试去除依赖项-即使是在测试时。

首先,您可以使用一些漂亮的System.out(但请稍后删除它,这样它就不会污染日志文件)

如果你打印这些信息

System.out.println( "request.getContextPath(): " + request.getContextPath() );
System.out.println( "new File(request.getContextPath()) : " + new File(request.getContextPath()).getAbsolutePath()  );
你会发现一个小小的惊喜。您将从中获得更多信息

System.out.println( "new File() : " + new File().getAbsolutePath()  );
如果你真的需要加载一个静态文件,你应该问问自己为什么要这样做,你会从中得到什么。不要编写一些你以后不需要的东西。也许你能找到一个更好的解决方案——甚至是一个更好的(自动)可测试的解决方案

如果您确实需要静态文件(如图像),可以将其放入类附近的jar中:

@看

如果您需要将内容文件作为某种配置文件,那么您应该重新考虑您的体系结构,并从一些可配置参数(如web.xml)中找到文件的路径


记住:不要建造你不需要的东西。不要把时间浪费在以后要删除的东西上,这些东西集成在软件中。试着摆脱依赖项,即使是在测试中。

很可能您使用分隔符的方式错误,导致路径错误。您可以通过调试甚至记录来检查这一点

尝试从计算机的资源管理器中获取实际文件的完整路径,并将其与运行时创建的路径进行比较

关于使用分隔符,您可以尝试以下操作:

    String SEPARATOR = System.getProperty("file.separator");

    ServletContext ctxt = FacesService.getHttpServletRequest().getSession().getServletContext();
    String filepath = ctxt.getRealPath("json"+SEPARATOR+"op.json");
    System.out.println("File path = "+ filepath);

很可能您使用分隔符的方式错误,从而导致错误的路径。您可以通过调试甚至记录来检查这一点

尝试从计算机的资源管理器中获取实际文件的完整路径,并将其与运行时创建的路径进行比较

关于使用分隔符,您可以尝试以下操作:

    String SEPARATOR = System.getProperty("file.separator");

    ServletContext ctxt = FacesService.getHttpServletRequest().getSession().getServletContext();
    String filepath = ctxt.getRealPath("json"+SEPARATOR+"op.json");
    System.out.println("File path = "+ filepath);

首先,您应该尝试将文件或文件夹连同访问它的文件一起包含在src目录中

 URL url = getClass().getResource("op.json");

使用SOP确保文件路径中没有特殊字符(文件夹名称中没有空格,空格可以代替特殊字符)。因此,您可以访问该文件。

首先,您应该尝试将文件或文件夹与访问该文件的文件一起包含在src目录中

 URL url = getClass().getResource("op.json");

使用SOP确保文件路径中没有特殊字符(文件夹名称中没有空格,空格被特殊字符替代)。因此,您可以访问文件。

这给了我nullPointerException这给了我nullPointerException