Java 如何在没有完整路径的情况下传递文件?
我通过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
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
目录
注意:
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中的任何参数