现在有一个文件ccc.data,在一个类里用一个实例方法负责读取,方法返回一个String类型的值,在Servlet里调用这个方法。并把它输出。但是却报文件读取异常:
java.io.FileNotFoundException: E:\Information\Tomcat6.0\bin\tdy218\threeDES\key_
Operate\key\key.txt (系统找不到指定的路径。)

真实文件确实不在上面这个目录下放着。
然后我又在放Servlet的地方写个一个方法(main()方法),调用读取文件的方法。却可以读取出来。
先是相对路径不行,然后把相对路径转换成绝对路径也不行,我就发现,new File("").getAbsolutePath();有问题,在应用程序里还正常,一到web应用中就不行了。然后想用getServletContext().getRealPath(),然后看看要写的地方也抛弃了,我想在一个非Servlet的.java文件里用,需要继承HttpServlet类,换需要HttpServletRequest和HttpServletResponse对象。
真是无语了,大家帮忙看看。为了验证我有写了一个Servlet,只不过没有doGet()、doPost()方法罢了。
ccc.data的存放位置(绝对路径):
E:\Information\Tomcat6.0\webapps\ajax-register\WEB-INF\classes\tdy218\threeDES\key_Operate\key\ccc.data
生成的读取这个ccc.data文件的方法字节码文件的位置:
E:\Information\Tomcat6.0\webapps\ajax-register\WEB-INF\classes\tdy218\threeDES\key_Operate\Text_Read.class
生成的Servlet字节码文件的存放位置:
E:\Information\Tomcat6.0\webapps\ajax-register\WEB-INF\classes\tdy218\threeDES\MVC\Test_Servlet.class
源文件都在这里放着:
E:\Information\Tomcat6.0\webapps\ajax-register\WEB-INF\classes\
总结:使用相对路径不行,然后又换作转化绝对路径也不行。
private  final String  keyFile = "tdy218/threeDES/key_Operate/key/key.data";
new File("").getAbsolutePath()+....;
大家帮忙看看.

解决方案 »

  1.   

    在ajax-register目录下建一个文件夹data,然后将ccc.data 文件放在data文件夹下。
    然后:String path = getServletContext().getRealPath("/data");
    String separator = System.getProperty("file.separator");
    String filePath = path + separator + "ccc.data";
    File file = new File(filePath);
      

  2.   


    package tdy218.threeDES.key_Operate;
    import java.io.FileReader;
    import java.io.BufferedReader;
    import java.io.File;public class Text_Read  
    {
    private  final String  keyFile = "\\tdy218\\threeDES\\key_Operate\\key\\key.txt";
    public  String  read(){
    String key = "";
    try
            {
             String FilepathTemp = new File("").getAbsolutePath();
        FileReader  fer = new  FileReader(FilepathTemp+keyFile);
             BufferedReader  ber = new  BufferedReader(fer);
             while((key=ber.readLine())==null){break;}
             ber.close();
           }
           catch(Exception   e)
           {   
            e.printStackTrace();   
           } 
         return key;   
    }
    /*
    public static void main(String args[])
    {
     String res=new  Text_Read().read();
     System.out.println(res);
    }
    */
    }要是在上面的程序里用getServletContext().getRealPath("/data");貌似不行吧?
    下面是我写的一个测试用的Servlet():package  tdy218.threeDES.MVC;import  java.io.*;
    import  javax.servlet.*;
    import  javax.servlet.http.*;
    import  tdy218.threeDES.key_Operate.Text_Read;public  class  Test_Servlet  extends  HttpServlet
    {
      public void init(ServletConfig config) throws ServletException 
       {
       super.init(config);
       } 
      public void service(HttpServletRequest request,HttpServletResponse response) throws IOException
       {
        response.setContentType("text/html;charset=gbk");
        PrintWriter  show = response.getWriter();
        show.println(new Text_Read().read());
       }
    }
      

  3.   

    而且这个key.data的文件是程序生成的,如果你注意的话,看到threeDES.key_Operate应该会猜到的。
      

  4.   

    你用访问页面的方式,试试是否可以读取该文件cc.data,如果可以访问该文件,就是那个路径了,通常地址是http://ip等等
      

  5.   

    可以在read()方法中传入参数       response.setContentType("text/html;charset=gbk");
           PrintWriter  show = response.getWriter();
           String path = getServletContext().getRealPath("/data");
           String separator = System.getProperty("file.separator");
           String filePath = path + separator + "ccc.data";

           show.println(new Text_Read().read(filePath));然后public  String  read(String filePath){
        String key = "";
        try
            {
             File file = new File(filePath).getAbsolutePath();
             FileInputStream is = new FileInputStream(file);
             InputStreamReader ir = new InputStreamReader(is);
             LineNumberReader ber = new LineNumberReader(ir);
             while((key=ber.readLine())==null){break;}
             ber.close();
           }
           catch(Exception   e)
           {   
            e.printStackTrace();   
           } 
         return key;   
    }
    还有就算你的.data文件是程序生成的,也可以将它放在/data下啊。
      

  6.   

    对不起,写错了^_^response.setContentType("text/html;charset=gbk");
           PrintWriter  show = response.getWriter();
           String path = getServletContext().getRealPath("/data");
           String separator = System.getProperty("file.separator");
           String filePath = path + separator + "ccc.data";
           show.println(new Text_Read().read(filePath));
    public  String  read(String filePath){
        String key = "";
        try
            {
             File file = new File(filePath);
             FileInputStream is = new FileInputStream(file);
             InputStreamReader ir = new InputStreamReader(is);
             LineNumberReader ber = new LineNumberReader(ir);
             while((key=ber.readLine())==null){break;}
             ber.close();
           }
           catch(Exception   e)
           {   
            e.printStackTrace();   
           } 
         return key;   
    }
      

  7.   

    文件的读取要交给Text_Read这个类来处理,而且定义一个方法,返回读取到的内容,在servlet里调用,由于这个文件很重要。我不想放在Servlet里以明文的方式显示任何关于这个文件的信息。
    这样的话,该咋弄那?
      

  8.   

    getRealPath()取得的是站顶目录位置
    要取得具体位置需要这样getRealPath("/你的文件相对位置")