我正在运行Netbeans 7.1.2,我正在尝试访问servlet中的一些文本文件:
package com.optimizations.cutting;
@WebServlet(name = "Servlet", urlPatterns = {"/Servlet"})
public class Servlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("in servlet "+System.currentTimeMillis());
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
DataManager dm = new DataManager();
SheetInfo si = dm.loadSheetInfoCSV("sheetInfo.csv");
ArrayList<Piece> pieces = dm.loadPiecesCSV("res/pieces4.csv");
....
我已将sheetInfo.csv
和pieces4.csv
个文件放在我能想到的任何地方,尝试使用反斜杠(/sheetInfo.csv
或/res/pieces4.csv
)来访问它们
当我说“我能想到的任何地方”时,我的意思是:当前目录(源包),Servlet.java
旁边以及我创建的所有其他文件(包括使用它的DataManager.java
)。我还在"Add folder"
- &gt; Properties window
- &gt; Sources
中完成了Package Folder
。 (添加了2个文件夹,只是为了确保)。所以我亲爱的文件一次只有3个地方:
src/java/com/optimizations/cutting
Servlet.java
和DataManager.java
src/java/res
src/resources
但我得到了
SEVERE: java.io.FileNotFoundException: resources/pieces4.csv (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:97)
at java.io.FileReader.<init>(FileReader.java:58)
at com.optimizations.cutting.DataManager.loadPiecesCSV(DataManager.java:98)`
我还重新启动了服务器(Glassfish 3.1.2)
(也许这看起来很傻但我还需要知道我应该在哪里以及如何放置我的文件以便可以从客户端和服务器访问它们 - 我的servlet将创建一些图像(.jpg)并存储它们(其中) ?)并将文件名发送回.jsp,然后将其显示在彩色框中)
提前感谢。
修改
添加了更多行的错误和 DataManager.java中的调用:
public SheetInfo loadSheetInfoCSV(String filename){
....
br = new BufferedReader( new FileReader(filename));
String strLine = "";
//read comma separated file first line
if ((strLine = br.readLine()) != null)
....
答案 0 :(得分:1)
该例外情况表明您使用FileInputStream
来获取InputStream
。当资源涉及类路径资源时,这不是正确的方法(您尝试将其放入的所有位置都是类路径的一部分)。您应该使用ClassLoader#getResourceAsStream()
将类路径资源作为类路径资源,而不是使用FileInputStream
作为本地磁盘文件系统资源。
如果资源文件foo.ext
与您尝试加载资源的类(即DataManager
类)放在同一个包中,那么您只需使用get an {{ 1}}它的唯一文件名如下:
InputStream
或当您进入InputStream input = getClass().getResourceAsStream("foo.ext");
上下文时:
static
如果资源InputStream input = DataManager.class.getResourceAsStream("foo.ext");
放在与您尝试加载资源的类不同的包中,例如foo.ext
包,然后您可以通过其类路径相对路径获取com.example
,如下所示,其中前导斜杠InputStream
将您带到类路径的根目录:
/
此处,InputStream input = getClass().getResourceAsStream("/com/example/foo.ext");
可以用仲裁getClass()
代替,只要该类由具有相同包结构访问权限的同一Foo.class
加载即可。
另一种方法是使用从当前线程获得的上下文ClassLoader
。它可以访问所有内容。您只能指定类路径相对路径,它始终相对于类路径的根(因此不应使用前导斜杠ClassLoader
):
/