1, 从当前程序的根目录找 
比如你的程序: abc.jar
那么就从abc.jar 所在目录找文件.2, 从当前程序的bin下找. (如果在eclipse下运行 那么他就从bin目录下找这个文件)
比如你的程序: abc.jar
那么就从abc.jar 这个jar包里面找.
-----------------要我自己写程序的话 一般都强行让自己 写成第1种的方式.
因为这样简洁明朗. 完全隔离 程序文件 与 配置文件但是接手他人的项目后发现很多人用了第2种方式.
而我在eclipse调试的时候没发现问题.因为eclipse直接从 bin目录下找文件了.但是打成jar之后 却发现找不到文件了.为了解决这个问题我尝试把 所有配置分别在 jar包里 以及jar包外分别放了1份. 但是根本不解决问题.这样的问题怎么办?

解决方案 »

  1.   

    还有就是,  怎么分别实现这样2个 写法呢?目前我只会1. 而且我的理解上固执的认为第2种方式 根本就是胡搅蛮缠, 怎么会去从jar包里面读取一个配置文件呢.当初这样设计的意义以及优势到底是什么?
      

  2.   

    把所有的jar配置到eclipse的classpath里么,导出的时候注意把所有的资源都导出。
      

  3.   


    我是直接从磁盘里面拷贝的 配置文件的目录.然后用rar工具把 abc.jar打开, 然后粘贴进去的.
    这样做了之后他能够读取到外围的1个文件了. 但是他接下来读另外一个文件的时候报错了:
    java.io.FileNotFoundException: class path resource [cfg/properties/config.properties] cannot be resolved to absolute file path because it does not
      

  4.   

    把所有的jar复制,粘贴到web-inf/lib下。
      

  5.   

    你说的第一种方式,是从通过指定文件目录来寻找。
    比如你这么定义文件的时候:File file = new File("abc.txt");
    没有指定目录,则为当前目录。
    而第二种方式,是从classpath中查找。
    比如:InputStream is = this.getClass().getResourceAsStream("/abc.txt");
    是在所有的classpath中查找abc.txt。
    与你的想法相反,胡搅蛮缠的,是第一种方式。因为当前目录是不随时变化的,而classpath是可以通过启动脚本去定义的。另外,并不是一定要把要用的文件放到bin里,一般是将配置文件放到比如说叫做config的目录中,然后将这个目录添加到classpath里。
      

  6.   

    参考代码package test;import java.io.*;
    import java.util.*; public class FileReadWrite { /**
      * 描述:readFile
      * 
      * @param dir
      * @return
      * @throws IOException
      * @CreateOn Jul 28, 2008 2:16:23 PM
      * @author chun_chang
      */
     public StringBuffer readFile(String dir) throws IOException {
      StringBuffer buffer = null;
      try {
       buffer = new StringBuffer();
       InputStream fis = new FileInputStream(dir);
       BufferedReader reader = new BufferedReader(new InputStreamReader(fis));   String line = null;// 用来保存每行读取的内容
       line = reader.readLine(); // 读取第一行
       while (line != null) { // 如果 line 为空说明读完了
        buffer.append(line); // 将读到的内容添加到 buffer 中
        buffer.append("/n"); // 添加换行符
        line = reader.readLine(); // 读取下一行
       }
       System.out.println(buffer); // 将读到 buffer 中的内容写出来
       fis.close();
      } catch (FileNotFoundException e) {
       e.printStackTrace();
      }
      return buffer;
     }
      

  7.   


    还是不太明白.
    第2种方式优势在哪.第1种方式我也没发现具体缺点. 大部分的C++程序都这样写:
    我加载一段配置文件必定是要去程序的所在目录去加载. 如果非要制定定位到其他具体目录,那么写一个总path目录配置文件也能达到需求.
      

  8.   


    我在描述具体错误:ECLIPSE不报错. 因为他找的目录存在
    org.springframework.core.io.Resource.getFile()方法
    我通过resource..getURL().getPath() 发现目录定位到了 bin 下确切的配置文件.打成jar之后报错,因为找不到目录.
    org.springframework.core.io.Resource.getFile()方法
    我通过resource..getURL().getPath() 发现目录定位到了
     reside in the file system: jar:file:/E:/java_code/mydll/server/lserver/lserver.terse.jar!/serverCfg/properties/appConfig.properties
    但是 lserver.terse.jar! 这个东西到底是什么呢,是我的jar包吗? 如果是我的jar包的话 理论上他应该能找到appConfig.properties