d 盘中的分别有a.exe文件和一个b.properties文件,当我运行a时可以读取b文件,主要是用的这个方法读取文件
String location = URLDecoder.decode(
Config.class.getProtectionDomain().getCodeSource().getLocation().getFile(), "UTF-8");
可是程序跑到这里了
java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp\e4j1D81.tmp_dir13063\config.properties (系统找不到指定的文件。)
但是如果我换做运行a.jar文件时他就不会报错一切正常(我用的工具把a.jar打包成a.exe)
请问各位大侠是怎么回事,??

解决方案 »

  1.   

    可能是你的程序路径问题
    http://blog.csdn.net/swandragon/archive/2009/11/05/4770445.aspx你可以把属性文件也打包到jar文件中,之后将jar做成exe
      

  2.   

    b.properties 是你运行jar的必须文件么 ? 
    如果是的话,打进jar包里面,改下访问路径如果b.properties 是 执行jar的机器上会存在的文件, 那确认下你读取的路径,抓下FileNotFoundException异常,不存在这个文件程序要怎么继续执行
      

  3.   

    打包的时候把b.properties也打进去,程序里面改用相对路径。
      

  4.   

    比如假设目录结构
    config/b.properties
    jre
    lib/a.jar那你的代码里面的这个路径就可以直接写
    ./config/b.properties
    打包的时候直接把他们都扔进去就好。
      

  5.   

    java技术交流群100756746,希望大家加入,我们共同讨论,共同进步!
      

  6.   

    一、多种方式读文件内容。1、按字节读取文件内容
    2、按字符读取文件内容
    3、按行读取文件内容
    4、随机读取文件内容import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.RandomAccessFile;
    import java.io.Reader; 
    public class ReadFromFile {
    /**
       * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。
       * @param fileName 文件的名
       */
    public static void readFileByBytes(String fileName){
       File file = new File(fileName);
       InputStream in = null;
       try {
        System.out.println("以字节为单位读取文件内容,一次读一个字节:");
        // 一次读一个字节
        in = new FileInputStream(file);
        int tempbyte;
        while((tempbyte=in.read()) != -1){
         System.out.write(tempbyte);
        }
        in.close();
       } catch (IOException e) {
        e.printStackTrace();
        return;
       }
       try {
        System.out.println("以字节为单位读取文件内容,一次读多个字节:");
        //一次读多个字节
        byte[] tempbytes = new byte[100];
        int byteread = 0;
        in = new FileInputStream(fileName);
        ReadFromFile.showAvailableBytes(in);
        //读入多个字节到字节数组中,byteread为一次读入的字节数
        while ((byteread = in.read(tempbytes)) != -1){
         System.out.write(tempbytes, 0, byteread);
        }
       } catch (Exception e1) {
        e1.printStackTrace();
       } finally {
        if (in != null){
         try {
          in.close();
         } catch (IOException e1) {
         }
        }
       }
    }
    /**
       * 以字符为单位读取文件,常用于读文本,数字等类型的文件
       * @param fileName 文件名
       */
    public static void readFileByChars(String fileName){
       File file = new File(fileName);
       Reader reader = null;
       try {
        System.out.println("以字符为单位读取文件内容,一次读一个字节:");
        // 一次读一个字符
        reader = new InputStreamReader(new FileInputStream(file));
        int tempchar;
        while ((tempchar = reader.read()) != -1){
         //对于windows下,\r\n这两个字符在一起时,表示一个换行。
         //但如果这两个字符分开显示时,会换两次行。
         //因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。
         if (((char)tempchar) != '\r'){
          System.out.print((char)tempchar);
         }
        }
        reader.close();
       } catch (Exception e) {
        e.printStackTrace();
       }
       try {
        System.out.println("以字符为单位读取文件内容,一次读多个字节:");
        //一次读多个字符
        char[] tempchars = new char[30];
        int charread = 0;
        reader = new InputStreamReader(new FileInputStream(fileName));
        //读入多个字符到字符数组中,charread为一次读取字符数
        while ((charread = reader.read(tempchars))!=-1){
         //同样屏蔽掉\r不显示
         if ((charread == tempchars.length)&&(tempchars[tempchars.length-1] != '\r')){
          System.out.print(tempchars);
         }else{
          for (int i=0; i<charread; i++){
           if(tempchars[i] == '\r'){
            continue;
           }else{
            System.out.print(tempchars[i]);
           }
          }
         }
        }
       
       } catch (Exception e1) {
        e1.printStackTrace();
       }finally {
        if (reader != null){
         try {
          reader.close();
         } catch (IOException e1) {
         }
        }
       }
    }
    /**
       * 以行为单位读取文件,常用于读面向行的格式化文件
       * @param fileName 文件名
       */
    public static void readFileByLines(String fileName){
       File file = new File(fileName);
       BufferedReader reader = null;
       try {
        System.out.println("以行为单位读取文件内容,一次读一整行:");
        reader = new BufferedReader(new FileReader(file));
        String tempString = null;
        int line = 1;
        //一次读入一行,直到读入null为文件结束
        while ((tempString = reader.readLine()) != null){
         //显示行号
         System.out.println("line " + line + ": " + tempString);
         line++;
        }
        reader.close();
       } catch (IOException e) {
        e.printStackTrace();
       } finally {
        if (reader != null){
         try {
          reader.close();
         } catch (IOException e1) {
         }
        }
       }
    }
    /**
       * 随机读取文件内容
       * @param fileName 文件名
       */
    public static void readFileByRandomAccess(String fileName){
       RandomAccessFile randomFile = null;
       try {
        System.out.println("随机读取一段文件内容:");
        // 打开一个随机访问文件流,按只读方式
        randomFile = new RandomAccessFile(fileName, "r");
        // 文件长度,字节数
        long fileLength = randomFile.length();
        // 读文件的起始位置
        int beginIndex = (fileLength > 4) ? 4 : 0;
        //将读文件的开始位置移到beginIndex位置。
        randomFile.seek(beginIndex);
        byte[] bytes = new byte[10];
        int byteread = 0;
        //一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。
        //将一次读取的字节数赋给byteread
        while ((byteread = randomFile.read(bytes)) != -1){
         System.out.write(bytes, 0, byteread);
        }
       } catch (IOException e){
        e.printStackTrace();
       } finally {
        if (randomFile != null){
         try {
          randomFile.close();
         } catch (IOException e1) {
         }
        }
       }
    }
    /**
       * 显示输入流中还剩的字节数
       * @param in
       */
    private static void showAvailableBytes(InputStream in){
       try {
        System.out.println("当前字节输入流中的字节数为:" + in.available());
       } catch (IOException e) {
        e.printStackTrace();
       }
    }public static void main(String[] args) {
       String fileName = "C:/temp/newTemp.txt";
       ReadFromFile.readFileByBytes(fileName);
       ReadFromFile.readFileByChars(fileName);
       ReadFromFile.readFileByLines(fileName);
       ReadFromFile.readFileByRandomAccess(fileName);
    }
    }二、将内容追加到文件尾部import java.io.FileWriter;
    import java.io.IOException;
    import java.io.RandomAccessFile;/**
    * 将内容追加到文件尾部
    */
    public class AppendToFile {/**
       * A方法追加文件:使用RandomAccessFile
       * @param fileName 文件名
       * @param content 追加的内容
       */
    public static void appendMethodA(String fileName, String content){
       try {
        // 打开一个随机访问文件流,按读写方式
        RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
        // 文件长度,字节数
        long fileLength = randomFile.length();
        //将写文件指针移到文件尾。
        randomFile.seek(fileLength);
        randomFile.writeBytes(content);
        randomFile.close();
       } catch (IOException e){
        e.printStackTrace();
       }
    }
    /**
       * B方法追加文件:使用FileWriter
       * @param fileName
       * @param content
       */
    public static void appendMethodB(String fileName, String content){
       try {
        //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
        FileWriter writer = new FileWriter(fileName, true);
        writer.write(content);
        writer.close();
       } catch (IOException e) {
        e.printStackTrace();
       }
    }public static void main(String[] args) {
       String fileName = "C:/temp/newTemp.txt";
       String content = "new append!";
       //按方法A追加文件
       AppendToFile.appendMethodA(fileName, content);
       AppendToFile.appendMethodA(fileName, "append end. \n");
       //显示文件内容
       ReadFromFile.readFileByLines(fileName);
       //按方法B追加文件
       AppendToFile.appendMethodB(fileName, content);
       AppendToFile.appendMethodB(fileName, "append end. \n");
       //显示文件内容
       ReadFromFile.readFileByLines(fileName);
    }
      

  7.   

    我是这样在netbeans里面打包的,但是行不通
     <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
          <zipgroupfileset dir="dist" includes="*.jar"/>
          <zipgroupfileset dir="dist/lib" includes="*.jar"/>
          <zipgroupfileset dir="dist" includes="*.properties"/>      <manifest>
               <attribute name="Main-Class" value="${main.class}"/>
          </manifest>
    </jar>
    这个好像是用来打包jar文件的,有没有什么方法可以把那个properties打进去
      

  8.   


    netbean 不太熟悉,eclipse里面很简单的
      

  9.   

    主要是那个properties文件和exe文件可以同时存在的,运行exe的时候可以读取properties文件的类容,这样做主要是为了方便修改properties文件的类容,