我想通过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。
有人可以指出我访问此文件的正确方法。
答案 0 :(得分:3)
首先,您可以使用一些不错的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() );
如果你真的需要加载一个静态文件,你应该问问自己为什么要这样做以及你将从中得到什么。不要编写一些你以后不需要的东西。也许您可以找到更好的解决方案 - 即使是更好(自动)可测试的解决方案。
如果你真的需要一个静态文件(如图像),你可以把它放在你班级附近的一个罐子里:
@see How to get a path to a resource in a Java JAR file
如果您需要将内容文件作为某种配置文件,则应重新考虑您的体系结构,并从一些可配置的参数(例如来自您的web.xml)中找到该文件的路径。
请记住:不要制作你不需要的东西。不要浪费你的时间来处理随后将在软件中集成的内容删除的内容。尝试摆脱依赖 - 即使是测试。
答案 1 :(得分:1)
您很可能以错误的方式使用分隔符,从而导致错误的路径。您可以通过调试甚至记录来检查。
尝试从计算机的资源管理器中获取实际文件的完整路径,并将其与您在运行时创建的路径进行比较
关于使用分隔符,您可以尝试这样的事情:
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);
答案 2 :(得分:1)
首先,你应该尝试在src目录中包含文件或文件夹以及访问它的文件。
URL url = getClass().getResource("op.json");
使用sops确保文件路径中没有特殊字符(文件夹名称中没有空格,替换特殊字符)。然后,您可以访问该文件。