如何在liferay中阅读文本文件?

时间:2016-10-25 12:57:33

标签: java

我尝试使用此代码

从控制器类中读取文件
    ReadFile readFile = new ReadFile();
    String text = readFile.readFile("\resources\testing.txt");
    renderRequest.setAttribute("text", text);

我已经从view.jsp中获取了

    <%
    String content = (String)request.getAttribute("text");
    %>

但我发现文件未找到异常。获取文件内容的方法是什么。

3 个答案:

答案 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();

其中requestrenderRequest / 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。

问候。