如何获取WEB-INF/class文件夹下的资源路径(java ee WEB动态项目)

如何获取WEB-INF/class文件夹下的资源路径(java ee WEB动态项目),java,servlets,Java,Servlets,我在Eclipse中开发web动态项目。一个名为“users.txt”的文件位于classes文件夹(WEB-INF/classes/users.txt)下 如何在类(基类,而不是servlet类)中获取此文件的相对路径?我将使用该路径附加几行文本 克里斯蒂安:这是阅读的准则。问题是我不知道如何创建对象,以便在具有相对路径的同一文件中写入(输出) public Products(){ try{ InputStream in = getClass().getClassLoa

我在Eclipse中开发web动态项目。一个名为“users.txt”的文件位于classes文件夹(WEB-INF/classes/users.txt)下

如何在类(基类,而不是servlet类)中获取此文件的相对路径?我将使用该路径附加几行文本

克里斯蒂安:这是阅读的准则。问题是我不知道如何创建对象,以便在具有相对路径的同一文件中写入(输出)

public Products(){
    try{
        InputStream in = getClass().getClassLoader().getResourceAsStream("products.txt");    
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        readProducts(br);
        in.close();
            br.close();


    }catch(Exception e){
        System.out.println("File doesn't exists");
    }
    }

    public void readProducts(BufferedReader in) throws NumberFormatException, IOException{

        String id="";
        String name="";
        double price=0;

        StringTokenizer st;
        String line;

        while((line=in.readLine())!=null){
            st=new StringTokenizer(line,";");
            while(st.hasMoreTokens()){
                id=st.nextToken();
                name=st.nextToken();
                price=Double.parseDouble(st.nextToken());           
            }           
            products.put(id,new Product(id,name,price));
        }
    }

一般来说,您不应该依赖于修改web应用程序目录中的文件

原因之一是servlet容器没有义务将
.war
文件提取到fs,理论上,它可以从内存中运行web应用程序。是的,Tomcat和大多数容器都会解包
.war
,但JavaEE规范中没有任何规定必须这样做

无论如何,如果您认为这值得冒险,您可以使用它来获取webapp目录中文件的位置

这应该是这样的:

  • 在您的webapp根目录下创建一个文件
    myfile
    (应该位于
    .war
    中的
    WEB-INF
    相同的文件夹中)
  • 在servlet中(或可以访问servlet上下文的任何地方)执行类似操作:

    字符串filePath=getServletContext().getRealPath(“myfile”)


  • 请注意,为了使此功能正常工作,您应该能够通过请求获取文件,例如:
    http://://myfile
    (有关详细信息,请参阅方法文档)

    您是否可以发布一些代码至少您到目前为止尝试了什么?您正在错误的方向上寻找解决方案。您不应该在运行时写入部署文件夹,更不用说部署类路径了。将文件放在部署文件夹外的固定位置。额外的好处是,您当前的问题可以通过这种方式立即得到解决。顺便说一下,通常的做法是使用SQL数据库来处理这类内容。