我已经运行了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"
在 Properties window
-> Sources
-> Package Folder
. (添加了2个文件夹,只是为了确保)。所以我亲爱的文件同时放在三个地方: 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)
....
1条答案
按热度按时间2skhul331#
例外情况表明您正在使用
FileInputStream
得到一个InputStream
当然。当资源涉及一个类路径资源时,这不是正确的方法(您试图将其放入的所有位置都是类路径的一部分)。您应该使用ClassLoader#getResourceAsStream()
,而不是作为本地磁盘文件系统资源使用FileInputStream
.如果资源文件
foo.ext
与您试图加载资源的类(即DataManager
类),然后你可以使用InputStream
其唯一文件名如下:或者当你在房间里的时候
static
上下文:如果资源
foo.ext
与您试图加载资源的类(例如com.example
打包,然后你可以得到一个InputStream
它的类路径相对路径如下,其中/
带您到类路径的根:同样在这里
getClass()
可以由仲裁员代替Foo.class
,只要类由相同的ClassLoader
它可以访问相同的包结构。另一种方法是使用上下文
ClassLoader
从当前线程获取。它可以访问所有东西。您只能指定类路径相对路径,它总是相对于类路径的根(因此没有前导斜杠)/
应使用):