Java can';t使用Netbeans 7.1.2访问servlet中的文件资源
我正在运行Netbeans 7.1.2,我正在尝试访问servlet中的一些文本文件:Java can';t使用Netbeans 7.1.2访问servlet中的文件资源,java,servlets,netbeans,Java,Servlets,Netbeans,我正在运行Netbeans 7.1.2,我正在尝试访问servlet中的一些文本文件: package com.optimizations.cutting; @WebServlet(name = "Servlet", urlPatterns = {"/Servlet"}) public class Servlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpSer
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");
....
我还重新启动了服务器(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)
....
异常提示您正在使用
FileInputStream
获取它的InputStream
。当资源涉及类路径资源时(您试图将其放入的所有位置都是类路径的一部分),这不是正确的方法。您应该使用ClassLoader\getResourceAsStream()
将类路径资源作为类路径资源,而不是使用FileInputStream
作为本地磁盘文件系统资源
如果资源文件foo.ext
与您尝试加载资源的类(即DataManager
类)放在同一个包中,则您可以使用它的唯一文件名获取InputStream
,如下所示:
InputStream input = getClass().getResourceAsStream("foo.ext");
或者当您在静态环境中时:
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
。它可以访问一切。您只能指定类路径相对路径,它始终相对于类路径的根(因此不应使用前导斜杠):
异常提示您正在使用FileInputStream
获取它的InputStream
。当资源涉及类路径资源时(您试图将其放入的所有位置都是类路径的一部分),这不是正确的方法。您应该使用ClassLoader\getResourceAsStream()
将类路径资源作为类路径资源,而不是使用FileInputStream
作为本地磁盘文件系统资源
如果资源文件foo.ext
与您尝试加载资源的类(即DataManager
类)放在同一个包中,则您可以使用它的唯一文件名获取InputStream
,如下所示:
InputStream input = getClass().getResourceAsStream("foo.ext");
或者当您在静态环境中时:
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
。它可以访问一切。您只能指定类路径相对路径,它始终相对于类路径的根(因此不应使用前导斜杠):
好的..我将进行编辑以显示获取文件的确切方法(我没有直接使用FileInputStream。无论如何…我想知道的是为什么这种方法适用于一个简单的Java项目(不是web,而是桌面)。我的意思是,我在一个简单的桌面java项目中测试了DataManager类,然后将其添加到web项目中的源程序包中。我将尝试您的建议,我打赌它会起作用:)。我仍然想理解为什么第一个没有,但重要的是让它工作。好的,阅读部分工作得很好:)。我需要进入写作部分(当然现在失败了(它使用File File=new File(文件名);尝试{ImageIO.write(sheet,“png”,File);(继续..因为我不允许在5分钟后编辑评论)。但我猜它可以以同样的方式修复…为什么它在桌面应用程序上工作(而不是网络)?我该如何编写它们以供客户端浏览器查看?(反正我会开始谷歌搜索)您没有提到您需要能够写入它。这会彻底改变答案。您不应该将它放在类路径中,而是放在本地磁盘文件系统中的固定位置。然后您可以使用FileInputStream
/FileOutputStream
通常的方式(但使用绝对路径!!)。另请参阅。要将其提供给万维网,只需将位置作为虚拟主机添加到服务器配置,或创建一个用于流式处理它的servlet。好。因此,我将进行编辑以显示获取文件的确切方法(我没有直接使用FileInputStream。无论如何……我想知道为什么这种方法适用于简单的Java项目(不是web,而是桌面)。我的意思是,我在一个简单的桌面java项目中测试了DataManager类,然后将其添加到web项目的源程序包中。我将尝试您的建议,我打赌它会起作用:)我仍然想理解为什么第一个没有,但重要的是让它工作。好的,阅读部分工作正常