Java 如何从WEB-INF/classes目录中的类写入WebContent目录中的文件

Java 如何从WEB-INF/classes目录中的类写入WebContent目录中的文件,java,jakarta-ee,tomcat,file-handling,web-inf,Java,Jakarta Ee,Tomcat,File Handling,Web Inf,我在动态WEB应用程序的WEB-INF/Classes目录中有一个Java类UpdateStats。该类有一个函数writeLog(),该函数将一些日志写入文本文件。我希望该文本文件位于webcontent目录中。因此,每次调用updates stats时,该函数都会写入该文本文件中。 问题是如何从该函数中指定webcontent目录中文本文件的路径,该函数位于WEB-INF/Classes目录中。要编写文件,您需要知道服务器上WEB内容目录的绝对路径,因为文件类需要绝对路径 File f =

我在动态WEB应用程序的WEB-INF/Classes目录中有一个Java类UpdateStats。该类有一个函数writeLog(),该函数将一些日志写入文本文件。我希望该文本文件位于webcontent目录中。因此,每次调用updates stats时,该函数都会写入该文本文件中。
问题是如何从该函数中指定webcontent目录中文本文件的路径,该函数位于WEB-INF/Classes目录中。

要编写文件,您需要知道服务器上WEB内容目录的绝对路径,因为文件类需要绝对路径

File f = new File("/usr/local/tomcat/webapps/abc/yourlogfile.txt");
FileOutputStream out = new FileOutputStream(f);
out.writeLog("Data");
假设:abc是您的项目名称


部署应用程序时,WebContent不是任何目录。web内容下的所有文件都直接位于项目名称下。

您可以从ServletContext获取您的webapp根目录:

String path = getServletContext().getRealPath("WEB-INF/../");
File file = new File(path);
String fullPathToYourWebappRoot = file.getCanonicalPath();

希望这有帮助。

您可以在servlet中执行以下操作

当您执行
getServletContext().getRealPath()
并放置一些字符串参数时,文件将在webcontent位置看到。 如果您想在WEB-INF中输入一些内容,可以提供类似“WEB-INF/my_updates.txt”的文件名


我希望您能很好地认识到,如果您打算将数据存储在战争期间以外的时间,那么这不是一个好的存储位置。无论何时重新部署WAR,部署文件夹中的任何更改都将丢失,原因很简单,这些更改不包含在WAR文件本身中。顺便说一句,令人失望的是,到目前为止,没有一个答案考虑到这一点。如果我在windows、mac或其他服务器上工作,该怎么办?
    File update_log = null;
final String fileName = "my_updates.txt";

@Override
public void init() throws ServletException {
    super.init();
    String file_path = getServletContext().getRealPath(fileName);
    update_log = new File(file_path);
    if (!update_log.exists()) {
        try {
            update_log.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Error while creating file : " + fileName);
        }
    }
}

public synchronized void update_to_file(String userName,String query) {

    if (update_log != null && update_log.exists()) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(update_log, true);
            fos.write((getCurrentFormattedTime()+" "+userName+" "+query+"\n").getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}