报错信息
ERROR - E:\Apache%20Software%20Foundation\apache-tomcat-6.0.18\webapps\BookShop\WEB-INF\classes\db.properties (系统找不到指定的路径。)
java.io.FileNotFoundException: E:\Apache%20Software%20Foundation\apache-tomcat-6.0.18\webapps\BookShop\WEB-INF\classes\db.properties (系统找不到指定的路径。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at com.icss.util.DbInfo.init(DbInfo.java:28)
at com.icss.util.DbInfo.instance(DbInfo.java:19)
at com.icss.dao.BaseDao.openConnection(BaseDao.java:29)
at com.icss.dao.UserDao.login(UserDao.java:13)
at com.icss.biz.UserBiz.login(UserBiz.java:14)
at com.icss.control.LoginSvl.doPost(LoginSvl.java:43)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:744)
出现错误的原因
Tomact安装目录中有空格,使用反射获取db.properties文件目录时,空格被‘%20’取代,无法找到正确位置
URL对空格,特殊字符和中文进行了编码处理
出错的代码
Properties prop = new Properties();
String path = DbInfo.class.getResource("/").getPath() + "db.properties";
prop.load(new FileInputStream(new File(path)));
解决方法
将URL转成URI。URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。(摘自JDK API)
Properties prop = new Properties();
String path = DbInfo.class.getResource("/").toURI().getPath() + "db.properties";
prop.load(new FileInputStream(new File(path)));
更多详细解释:http://www.360doc.com/content/11/1009/17/4602013_154657565.shtml