tomcat6安装在d:\tomcat6,操作系统在c盘
部署在d:\tomcat6\webapps\root\index.jsp需要读取一个根目录外的文件,文件所在位置是d:\test\test.xml
代码例子如下
-------------------------------------------
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="java.util.*,java.lang.*,java.io.*"%>
<%
File f = new File("\\test\\test.xml");
InputStreamReader read = new InputStreamReader (new FileInputStream(f),"UTF-8");
BufferedReader reader=new BufferedReader(read);
String line;
while ((line = reader.readLine()) != null) {
out.println(line);
}
%>
---------------------------------------------如果启动方式是使用d:\tomcat\bin\tomcat6.exe,可以成功读取文件
如果是使用系统服务启动tomcat,则无法读取文件读取的要求是不写入具体的盘符,如:File f = new File("d:\\test\\test.xml");不知道是否可以通过配置tomcat启动的参数,来解决这个问题
在网上已经搜索了很久,也没有看到一个满意的答案
特来请教各位高手

解决方案 »

  1.   

    真应了那句话,java跨平台,但是未必能写出跨平台的代码!File构建 必须定位资源准确,否则异常耗费性能path+File.separator+path(请不要在用\\)不写入具体的盘符那是相对路径,跟工程环境有关。
      

  2.   

    文件读写必须要绝对路径。楼上说的没错,你这个代码不是跨平台的代码。\\test\\test.xml这种方式,在windows里的意义是磁盘跟目录。你的情况\\指的是d:\。服务启动的方式就会是c:\。所以你这个必挂无疑了。基础路径建议写道配置文件里,properties或者xml中。比如配置basepath=c:/之类的。
      

  3.   

    将test.xml文件放到WEB-INF下面  项目部署在TOMCAT后你就可用下列代码读取text.xml文件了
                    ServletContext servletContext = this.getServlet().getServletContext();
    String filePath = servletContext.getRealPath("WEB-INF");
    File file = new File(filePath+"/"+text.xml);
    FileInputStream in = new FileInputStream(file);
      

  4.   

    那样的话你随便把项目部署到哪都能够读取到text.xml文件
      

  5.   

    File file = new File(filePath+"/text.xml");
    这样才对 呵呵 弄错了
      

  6.   

    遇到这个问题,主要是因为原先用的是resin,而不是tomcat
    resin无论是直接启动,还是服务启动
    都可以读取d:\test\test.xml 
    并且写法也只是需要File f = new File("\\test\\test.xml"); 因为这段代码是win下测试,Linux下运行,所以盘符在此处直接定义或是作为系统变量是会有问题的
    看来tomcat和resin对于路径的判决还是有些不同
      

  7.   

    还是很感谢楼上各位对这个问题的回复,还要再想想有没有其他办法
    不知道resin是如何实现这个功能的
      

  8.   


    由于这个项目是php和java的混合项目,所以类似的xml配置文件没有部署在web-inf下,而是在外部一个文件夹呢,不过luoyuxuejava说的这个方法的确也挺好的
      

  9.   

    你的XML文件只要放在项目中就可以用那个方法  
      

  10.   

    我的也是这样的情况,我把xml文件放到Tomcat下的bin目录下就可以找到了。。
      

  11.   

    只要你的xml文件在放在项目中,无论是哪个目录下都能用我刚才说的方法读取出来,只不过
    servletContext.getRealPath("WEB-INF"); 方法中传的参数得变一下;
    还有就是你项目中所要读取的文件都得放在项目里面,不然你把项目部署到其他机器上就找不到文件了
      

  12.   

    好像Tomcat运行程序,不能超出容器的范围吧
      

  13.   

    问题解决了,查看了下tomcat的文档,发现working path可以解决这个问题在安装tomcat成为系统服务的时候,修改tomcat6/bin/service.bat文件将其中一行
    "%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions "-Dcatalina.base=%CATALINA_BASE%;-Dcatalina.home=%CATALINA_HOME%;-Djava.endorsed.dirs=%CATALINA_HOME%\endorsed" --StartMode jvm --StopMode jvm修改为
    "%EXECUTABLE%" //IS//%SERVICE_NAME% --StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap --StartParams start --StopParams stop --StartPath  %cd% --StopPath %cd%:\这样就算是tomcat由服务从C盘启动,程序也会读取D盘的文件,无需设定盘符,也无需程序判断绝对路径