我有一个Spring webapp,其.war文件已上传到Tomcat服务器。大多数基本功能均按预期工作-页面视图和表单提交。
.war
我现在的问题是我的Web应用程序需要读取和写入文件,而我对如何实现这一点一无所知(文件I / O返回java.lang.NullPointerException)。
java.lang.NullPointerException
我使用以下代码来获取TitiWangsaBinDamhore建议的给定文件的绝对路径,以了解相对于服务器的路径:
HttpSession session = request.getSession(); ServletContext sc = session.getServletContext(); String file = sc.getRealPath("src/test.arff"); logger.info("File path: " + file);
这是输出路径:
/home/username/tomcat/webapps/appname/src/test.arff
但是,当我通过WinSCP检查文件目录时,文件的实际路径为:
/home/username/tomcat/webapps/appname/WEB-INF/classes/test.arff
这是我的问题 :
C:/Users/Workspace/appname/src/test.arff
Apache Tomcat 6.0.35
PS 我只需要访问两个文件(<1MB的每个),所以我不认为我可能需要使用数据库中包含他们所建议减去在此线程。
文件I / O
以下是用于访问所需文件的代码。
BufferedWriter writer; try { URI uri = new URI("/test.arff"); writer = new BufferedWriter(new FileWriter( calcModelService.getAbsolutePath() + uri)); writer.write(data.toString()); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); }
读取文件:
ServletContext application = ...; InputStream in = null; try { in = application.getResourceAtStream("/WEB-INF/web.xml"); // example // read your file } finally { if(null != in) try { in.close(); } catch (IOException ioe) { /* log this */ } }
写入文件:
ServletContext application = ...; File tmpdir = (File)application.getAttribute("javax.servlet.context.tempdir"); if(null == tmpdir) throw new IllegalStateException("Container does not provide a temp dir"); // Or handle otherwise File targetFile = new File(tmpDir, "my-temp-filename.txt"); BufferedWriter out = null; try { out = new BufferedWriter(new FileWriter(targetFile)); // write to output stream } finally { if(null != out) try { out.close(); } catch (IOException ioe) { /* log this */ } }
如果您不想使用servlet容器提供的tmpdir,则应该使用完全不在servlet上下文所能提供的范围之内的类似之类的/path/to/temporary/files东西。您绝对不希望将容器的临时目录用于除真正的临时文件以外的其他任何东西,这些文件可以在重新部署后删除,等等。
/path/to/temporary/files