2014-03-03 26 views
0

我正在编写使用jsp文件直接调用java类来获取结果的webApp。使用getResourceAsStream进行BufferedReader和InputStream

的JSP文件是这样的:

<% 
    String queryKey = request.getParameter("id"); 
    int jobID = Integer.parseInt(queryKey); 
    out.println(jobID); 
    ArrayList<Integer> myTopList = JobRecByBoWJaccard.topJobsByBoW(jobID); 
%> 

在Java类文件被访问过:

BufferedReader br = new BufferedReader(new FileReader("WebContent/StopWords/stop-words-english1.txt")); 

private InputStream modelInputT = new FileInputStream("WebContent/OpenNLP_Models/en-token.bin"); 

将tomcat找不到引用的文件,有人表示使用getResourceAsStream,但这是针对servlet的。我直接调用java类而不使用任何servlet。

private InputStream modelInputT = = this.getClass().getClassLoader().getResourceAsStream("WebContent/OpenNLP_Models/en-token.bin"); 

这导致java类无法找到该文件。需要帮助以及如何对这些Java类进行更改?

+0

哪里是WebContent目录里面你战争?看起来你的相对路径是错误的。其他选项是使用文件的绝对路径。 –

+0

只有当您尝试加载的资源位于类路径中时,getResourceAsStream才起作用,即在您的案例中的jar或WEB-INF/classes中。如果资源存在,那么您应该检查包含它的包/文件夹结构:WEB-INF/classes/OpenNLP_Models/en-token.bin意味着getResourceAsStream(“OpenNLP_Models/en-token.bin”);. – robermann

+0

@BimaleshJha我改成了'/ Users/XX/XX/Eclipse/App/WebContent/StopWords/stop-words-english1。txt'仍然无法在Mac上工作 – GeorgeG

回答

1

将tomcat找不到引用的文件...

这是因为路径名是不正确的,除非JVM的当前目录是“的WebContent”目录的父目录。当您使用FileInputStream打开文件时,相对路径名将在启动时相对于JVM 的当前目录进行解析。

...有人说使用getResourceAsStream,但这是为servlet。

不,那也不正确。该方法不是“用于servlet”。该方法的目的是打开类/类加载器类路径上的资源。如果您的“WebContent/StopWords/stop-words-english1.txt”位于Web应用程序的“/ WEB-INFO/classes”或“/ WEB-INFO/lib”的JAR文件中,则getResourceAsStream会找到它。


就你而言,你似乎在谈论与默认servlet对应的“WebContent”目录。

在这种情况下,请阅读此Q & A - How can I get real path for file in my WebContent folder?

所以,如果你正试图从一个JSP中访问这些文件,它好像你应该写这样的:

new FileReader("WebContent/StopWords/stop-words-english1.txt") 

就象这样:

new FileReader(getServletContext().getRealPath(
      "/StopWords/stop-words-english1.txt")) 
+0

我没有WEB-INF中的'classes'文件夹,所以我创建了一个。并使用this.getClass()。getClassLoader()。getResourceAsStream(“/ WebContent/WEB-INF/classes/OpenNLP_Models/en-token.bin”);访问该文件。这失败了。 JSP文件仅用于调用java类。 getServletContext在java类中不起作用。它必须在servlet中。 – GeorgeG

+0

@GeorgeG - 你没有多大意义。 1)如果将“OpenNLP_Models/en-token.bin”放入“/ WebContent/WEB-INF /类别”中,则应将“getResourceAsStream”的路径名称设置为“/OpenNLP_Models/en-token.bin”。 2)如果您需要在某个不是Servlet的类中打开文件,请更改您的代码,以便在servlet方法中调用'getServletContext()。getRealPath'并将结果路径名传递给需要它的类。 (Duh!) –

+0

它通过使用InputStream来解决modelInput = this.getClass.getResourceAsStream(“en-token.bin”);并将en-token.bin添加到java类的相同包中。 – GeorgeG

相关问题