Java 如何在没有完整路径的情况下传递文件?

Java 如何在没有完整路径的情况下传递文件?,java,file,servletcontextlistener,Java,File,Servletcontextlistener,我通过java程序创建了文件更新的简单程序 public class AppendToFileExample { private static final String FILENAME = "TestFile.txt"; public static void main(String[] args) { BufferedWriter bw = null; FileWriter fw = null; try { String data = " Th

我通过java程序创建了文件更新的简单程序

public class AppendToFileExample {

private static final String FILENAME = "TestFile.txt";

public static void main(String[] args) {

    BufferedWriter bw = null;
    FileWriter fw = null;

    try {

        String data = " This is new content after edit";

        File file = new File(FILENAME);
        fw = new FileWriter(file, true);
        bw = new BufferedWriter(fw);
        bw.write(data);
        System.out.println("Done");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bw != null)
                bw.close();
            if (fw != null)
                fw.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        }
    }
  }
它正在成功地工作
但后来我尝试在ServletContextListener的帮助下做同样的事情,但是使用servlet,一切都很好,除了我必须像这样放置完整的文件路径

 String FILENAME = "C:\\Users\\admin\\workspacetasks\\UpdateText\\TestFile.txt";
 String FILENAME = "test.txt";
使用这个完整路径,它可以正常工作,但当我尝试只传递这样的文件名时,它不会更新文件

 String FILENAME = "C:\\Users\\admin\\workspacetasks\\UpdateText\\TestFile.txt";
 String FILENAME = "test.txt";
所以我的问题是如何在没有文件完整路径的情况下传递文件..还有其他方法吗?或者有任何链接可供参考吗? 多谢各位

下面是我的ServletContextListener

public class StartupListener implements ServletContextListener {

private static Logger log = Logger.getLogger(StartupListener.class);
@Override
public void contextInitialized(ServletContextEvent arg0) {
    System.out.println("contextInitialized");
    UpdateTextFile updateTextFile = new UpdateTextFile();   
    System.out.println("Before");
    updateTextFile.exec();
    System.out.println("after");
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
    // TODO Auto-generated method stub
    }
}
然后这将调用java程序中的方法,该程序在这里

 public class UpdateTextFile 
{
    private static Logger log = Logger.getLogger(UpdateTextFile.class);
     public void exec() {
  //        String FILENAME = "C:\\Users\\admin\\workspacetasks\\UpdateText\\TestFile.txt";
      String FILENAME = "TestFile.txt";
      System.out.println("Inside exce ");
      BufferedWriter bw = null;
      FileWriter fw = null;
     try {
        String data = "Aloha after edit \n";
        System.out.println(data);
        File file = new File(FILENAME);
        System.out.println(FILENAME);
        System.out.println("Before FileWriter");
        fw = new FileWriter(file, true);
        System.out.println("After FileWriter");
        System.out.println("Before BufferedWriter");
        bw = new BufferedWriter(fw);
        System.out.println("After BufferedWriter");
        System.out.println("Before Write Data");
        bw.write(data);
        System.out.println("After Write Data");
        System.out.println("Done");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bw != null)
                bw.close();
            if (fw != null)
                fw.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
     }
  } 
 }

如果您的代码没有抛出任何异常,那么肯定是在创建文件,而不是在您认为的地方。将相对于应用程序的当前工作目录创建具有相对路径的文件,不管是什么。对于servlet容器,它肯定不会在webapp自己的目录中的任何地方。例如,在Tomcat中,它可能是Tomcat的
bin
目录

注意:

  • 与@SilvanBregy现在删除的答案相反,应用程序的CWD不一定与它自己的JAR文件所在的位置有关,与@soufrk的评论相反,它与类路径完全无关

  • exists()
    测试和
    createNewFile()
    调用都完全是浪费时间
    newfileoutputstream()
    已经这样做了,因此您将强制系统执行这两次操作,并删除刚刚创建的文件

  • 您也不需要调用
    getAbsoluteFile()
    :仅调用
    文件就足够了

  • 但是,您确实需要关闭
    BufferedWriter


  • 是的,问题已经解决了。如果将来有人遇到同样的问题,那么
    只需右键单击程序运行方式>运行配置>左侧面板上的Tomcat 8>参数,然后根据需要设置其他工作目录…

    不知道它的正确方法,但这就是我得到的..如果任何人得到任何其他方法而不更改工作目录,那么请共享其他方法如果我得到任何方法,我将发布它

    ,这是因为您的
    Servlet
    可能与您的Java应用程序具有不同的类路径。如果您得到一个
    FileNotFoundException
    ,它将告诉您Servlet实际上在哪里查找该文件。把文件放好there@soufrk令人惊讶的是,它甚至没有抛出FileNotFoundException或任何异常…它在Tomcat中打印日志以及在控制台中打印System.out.println…它只是没有编辑test.txtfile@soufrk它与类路径完全无关。它与servlet容器的当前工作目录有关。@EJP那么我的代码中有什么错误吗?或者还有另一种方法?你的建议是什么?@vik666如果你的代码没有抛出任何异常,那么文件正在创建中,而不是你认为的地方。注意
    exists()
    测试和
    createNewFile()
    调用都完全是浪费时间
    newfileoutputstream()
    已经这样做了,因此您将强制系统执行这两次操作,并删除刚刚创建的文件。您也不需要调用
    getAbsoluteFile()
    :仅调用
    文件就足够了。但是,您确实需要关闭
    BufferedWriter
    。是的,我按照您在第2点和第3点中所说的做了。如果您看到我的Java代码Filename=fullpath/test.txt在通过完整路径时起作用。当我通过Filename=“test.txt”时,它就不起作用了。在console@vik666你所说的“代码”是什么意思?它就是不起作用了?只是,代码将以绝对路径或相对于
    Servlet
    的路径生成文件。写入操作完成后,打印
    getAbsoluteFile()
    ,并检查同一位置。@vik666如果没有异常和删除,它正在工作。您在错误的位置查找文件。就这么简单。@soufrk又错了。第三次。它不是“相对于Servlet”。它与Servlet完全无关。可能您可以停止在此处发布猜测和错误信息。@EJP yes文件在工作区中,但它没有更新我试图通过代码发送的内容。如果另一个servlet想在其他地方编写另一个相对文件呢?在这里,您可以使用System.getProperty(“user.home”)这会将您带到这里C:\Users\admin,然后在代码中,您只需要添加您的工作区和项目名称……在这种情况下,您不需要更新tomcat中的任何参数