我尝试使用此代码
从控制器类中读取文件 ReadFile readFile = new ReadFile();
String text = readFile.readFile("\resources\testing.txt");
renderRequest.setAttribute("text", text);
我已经从view.jsp中获取了
<%
String content = (String)request.getAttribute("text");
%>
但我发现文件未找到异常。获取文件内容的方法是什么。
答案 0 :(得分:5)
在Java字符串中,\
启动转义序列和&#34; \ r&#34;和&#34; \ t&#34;是转义字符。例如&#34; \ t&#34;是带有 tab 字符的字符串。如果你在字符串中确实需要\t
,那么你必须逃避反斜杠
doSomething("\\resources\\testing.txt");
或者只是消除麻烦:当您使用正斜杠作为目录分隔符时,Java运行良好
doSomething("/resources/testing.txt");
请注意,这指的是根目录中当前路径所在的任何驱动器上的文件,它可能是C:\ resources \ testing.txt或D:\ resources \ testing.txt - 除非您的{{1}实现以某种方式操纵路径(我留意你的判断)。您可以在命令行应用程序中独立于Liferay进行测试。在jsp显示之前会抛出异常(我已经更改了标记以标记相关性)
这是纯Java,完全独立于Liferay。
答案 1 :(得分:0)
问题在于您的资源文件(testing.txt
)的相对路径,它必须是绝对的。要创建绝对路径,首先您需要portletContext
,您可以从request
获取,如下所示:
MVC Portlet:
PortletContext portletContext = request.getPortletSession().getPortletContext();
其中request
是renderRequest
/ actionRequest
对象。在JSF中,您可以从request
获取externalContext
,如下所示:
JSF Portlet:
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
PortletRequest request = (PortletRequest) externalContext.getRequest();
PortletContext portletContext = request.getPortletSession().getPortletContext();
此外,正如 Olaf Kock 所建议的那样,如果您使用\
,则需要将其转义,否则请使用/
。我更喜欢使用File.separator
,因为它根据操作系统返回斜杠(我认为!)。
String relativeFilePath = File.separator + "resources" + File.separator + "testing.txt";
现在,您可以使用portletContext
as,
String absoluteFilePath = portletContext.getRealPath(relativeFilePath);
然后,你的代码的其余部分如下:
ReadFile readFile = new ReadFile();
String text = readFile.readFile(absoluteFilePath);
renderRequest.setAttribute("text", text);
答案 2 :(得分:-1)
由于您收到FileNotFoundException,您确定要指向正确的文件路由吗?你尝试过绝对路径吗?你用的是什么?因为文件分隔符(&#34; \&#34;)可能是导致问题的原因。
HIH。
问候。