我最近使用 eclipse 在 Java 中创建了一个 Web 项目。我有一个包含计时器任务的 servlet。该计时器任务调用我创建的 XML 编写类的“writeList”方法。这一切都工作正常,并且我已经使用 System.out 验证了它每分钟运行一次。
当我从 Eclipse 中将 XML 编写类作为应用程序运行时,它工作得很好。文件输出到“WebContent/test.rdf”没有任何问题。
但是,当我的 servlet 中的计时器任务调用它时,我收到以下错误:
java.io.FileNotFoundException: WebContent/Test.rdf(No such file or directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
at com.XMLWriter.writeList(XMLWriter.java:58)
at com.ServerTimer$1.run(ServerTimer.java:30)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
XMLWriter第58行代码如下:
fileOut = new FileOutputStream("WebContent/TEST.rdf");
model.write(fileOut);
fileOut 是一个 FileOutputStream,model 是 Jena 模型的一个实例,因为我正在使用 RDF。
任何帮助将不胜感激,我已经被这个问题困扰好几天了!有任何问题请告诉我!
编辑:所以它现在可以工作,但我想将文件写入我的 Web 项目的“WebContent”目录。有什么方法可以自动执行此操作吗?我无法让系统动态查找该目录。
最佳答案
您永远不应该以这种方式依赖相对路径。在 Java IO 中使用相对路径会带来可移植性问题。 java.io.File
对它所运行的 Web 应用程序上下文一无所知。实际路径将取决于当前工作目录,而当前工作目录本身并不是在所有环境中都是相同的,并且取决于您启动服务器/应用程序的方式。例如,它可能与 C:/Tomcat/bin
相关,而您的 TEST.rdf
显然不在那里。始终使用绝对路径,即使用完整磁盘文件系统路径。
如果是 JSP/Servlet Web 应用程序,您可以使用 ServletContext#getRealPath()
将相对web路径转换为绝对磁盘文件系统路径,您可以在Java IO内容中进一步使用它。相对网络路径 Root 于公共(public)网络内容。假设 /TEST.rdf
位于公共(public) Web 内容的根目录中,那么您可以在 Servlet 内获取 /TEST.rdf
的绝对磁盘文件系统路径,如下所示方式:
String relativeWebPath = "/TEST.rdf";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
关于java - 在 Eclipse Web 项目中的 Java Servlet 中使用 FileOutputStreams 和 Jena 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2371760/