无法写入文件 - JAVA Servlet

Not able to write in file - JAVA Servlets

我正在尝试写入 Java Servlet 中的文件。我在普通的 java 项目中有相同的代码,它工作正常,但在 Java Servlet 中却没有。

class包含的方法请参考下面的代码:

public class UserRecords {

    private String fileName = "Users.txt";

    public void addRecord(String firstName, String lastName, String email, String pass){

        try {
            FileWriter fw = new FileWriter(fileName, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);

            pw.println(firstName + " " + lastName + " " + email + " " + pass);

            fw.flush();
            fw.close();

        } catch (IOException ex) {
            Logger.getLogger(UserRecords.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Java 调用方法的Servlet:

public class Register extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String firstName = request.getParameter("firstName");
        String lastName = request.getParameter("lastName");
        String email = request.getParameter("email");
        String pass = request.getParameter("pass");

        UserRecords ur = new UserRecords();

//        ur.addRecord(firstName, lastName, email, pass);
          ur.addRecord("Bucky", "Roberts", "bucky@records.com", "mypass");

        HttpSession session = request.getSession();
        session.setAttribute("firstName", firstName);

        RequestDispatcher rd = request.getRequestDispatcher("/welcome.jsp");
        rd.forward(request, response);


    }

}

请帮忙指导写入文件Users.txt

提前致谢!

如果你想让它在 servlet 环境中可靠地工作,你需要了解更多关于你的东西将要在其中的环境的事情 运行。

第一,您的 servlet 可能会同时部署到同一台机器上的多个不同的 servlet 容器 运行。想想一个专门用于测试它是否在 Tomcat 以及 Glassfish 和 Websphere 以及...,或 Tomcat 7 以及 Tomcat 8 上运行的测试机器以及 Tomcat 9. 然后每个人都应该得到自己的 users.txt 文件,并且每个人都应该与其他人的 users.txt 隔离。没有优雅的方法可以解决这个问题,只能将文件路径放在 ${user.home} 中,然后希望,比如三个 tomcat 实例,不在 运行 下用户 ID.

然后,在给定的 servlet 容器中,您的 servlet 可能会部署到多个不同的虚拟主机。因此,您需要从您的环境中获取虚拟主机名并将其包含在完整的文件路径中(java EE 中有一个调用可以执行此操作,但我记不清是哪一个)。

然后,在给定的虚拟主机中,您的 servlet 可能已包含在多个不同的应用程序 (/context) 中,您需要确保每个实例都与其他应用程序 (/contexts) 的实例隔离它包含在中。因此您需要从您的环境中获取应用程序 (/context) 名称并将其包含在完整文件路径中。

最后,在非 EE 环境 ("in a normal java project") 中执行这些调用显然会产生崩溃,最坏的情况下会产生 "where has the file gone" 的相同问题。

编辑以进一步说明:

我说 "you need to ensure ... insulated" 的意思更多是 "you need to think it through and determine whether you want insulation or sharing at that level"。如果您确实想要共享,那么您必须确保您的数据管理具有所有常用的 ACID 属性,就像您 would/could 使用的任何其他 DBMS 引擎一样。