熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java相對路徑讀取文件

2013-11-23 19:30:33  來源: Java核心技術 

  不管你是新手還是老鳥在程序中讀取資源文件總會遇到一些找不到文件的問題這與Java底層的實現有關不能算bug只要方法得當問題還是可以解決的

  項目的文件夾結構

  repathtest

  ├─src

  │    └─com

  │            └─lavasoft

  │                    ├─test

  │                    └─res

  ├─doc

  在Java開發工具的project中使用相對路徑

  在project中相對路徑的根目錄是project的根文件夾在此就是repathtest文件夾了

  創建文件的寫法是

  File f = new File(src/com/lavasoft/res/atxt);

  File f = new File(doc/btxt);

  注意

  路徑不以/開頭

  脫離了IDE環境這個寫法就是錯誤的也並非每個IDE都如此但我見到的都是這樣的

  通過CLASSPATH讀取包內文件

  讀取包內文件使用的路徑一定是相對的classpath路徑比如a位於包內此時可以創建讀取a的字節流

  InputStream in = ReadFileclassgetResourceAsStream(/com/lavasoft/res/atxt);

  有了字節流就能讀取到文件內容了

  注意

  這裡必須以/開頭

  看看完整的測試代碼

  package comlavasofttest;

  import javaio*;

  /**

  * Java讀取相對路徑的文件

  *

  * @author leizhimin ::

  */

  public class ReadFile {

  public static void main(String[] args) {

  readTextA_ByClassPath();

  readTextA_ByProjectRelativePath();

  readTextB_ByProjectRelativePath();

  }

  /**

  * 通過工程相對路徑讀取(包內)文件注意不以/開頭

  */

  public static void readTextA_ByProjectRelativePath() {

  Systemoutprintln(readTextA_ByProjectRelativePath);

  File f = new File(src/com/lavasoft/res/atxt);

  String a = fileString(f GBK);

  Systemoutprintln(a);

  }

  /**

  * 通過工程相對路徑讀取(包外)文件注意不以/開頭

  */

  public static void readTextB_ByProjectRelativePath() {

  Systemoutprintln(readTextB_ByProjectRelativePath);

  File f = new File(doc/btxt);

  String b = fileString(f GBK);

  Systemoutprintln(b);

  }

  /**

  * 通過CLASSPATH讀取包內文件注意以/開頭

  */

  public static void readTextA_ByClassPath() {

  Systemoutprintln(readTextA_ByClassPath);

  InputStream in = ReadFileclassgetResourceAsStream(/com/lavasoft/res/atxt);

  String a = streamString(in GBK);

  Systemoutprintln(a);

  }

  /**

  * 文件轉換為字符串

  *

  * @param f             文件

  * @param charset 文件的字符集

  * @return 文件內容

  */

  public static String fileString(File f String charset) {

  String result = null;

  try {

  result = streamString(new FileInputStream(f) charset);

  } catch (FileNotFoundException e) {

  eprintStackTrace();

  }

  return result;

  }

  /**

  * 文件轉換為字符串

  *

  * @param in            字節流

  * @param charset 文件的字符集

  * @return 文件內容

  */

  public static String streamString(InputStream in String charset) {

  StringBuffer sb = new StringBuffer();

  try {

  Reader r = new InputStreamReader(in charset);

  int length = ;

  for (char[] c = new char[]; (length = rread(c)) != ;) {

  sbappend(c length);

  }

  rclose();

  } catch (UnsupportedEncodingException e) {

  eprintStackTrace();

  } catch (FileNotFoundException e) {

  eprintStackTrace();

  } catch (IOException e) {

  eprintStackTrace();

  }

  return sbtoString();

  }

  }

  (代碼寫得粗糙異常沒做認真處理)

  運行結果

  readTextA_ByClassPath

  aaaaaaaaa

  sssssssss

  readTextA_ByProjectRelativePath

  aaaaaaaaa

  sssssssss

  readTextB_ByProjectRelativePath

  bbbbbbbbbbb

  Process finished with exit code

  這是通過IDEA開發工具運行的結果沒問題如果換成控制台執行那麼使用了項目相對路徑的讀取方式會失敗原因是此時已經脫離了項目的開發環境這個問題常常困擾著一些菜鳥代碼在開發工具好好的發布後執行就失敗了!

  下面我截個圖

   

  獲取CLASSPATH下文件的絕對路徑

  當使用相對路徑寫入文件時候就需要用到絕對路徑下面是個例子

  package comlavasoft;

  import javaioFile;

  /**

  * CLASSPATH文件的絕對路徑獲取測試

  *

  * @author leizhimin ::

  */

  public class Test {

  //classpath的文件路徑

  private static String cp = /com/lavasoft/cfg/syscfgproperties;

  public static void main(String[] args) {

  //當前類的絕對路徑

  Systemoutprintln(TestclassgetResource(/)getFile());

  //指定CLASSPATH文件的絕對路徑

  Systemoutprintln(TestclassgetResource(cp)getFile());

  //指定CLASSPATH文件的絕對路徑

  File f = new File(TestclassgetResource(cp)getFile());

  Systemoutprintln(fgetPath());

  }

  }

  輸出

  /D:/projects/bbt/code/cdn/planrpt/out/production/planrpt/

  /D:/projects/bbt/code/cdn/planrpt/out/production/planrpt/com/lavasoft/cfg/syscfgproperties

  D:\projects\bbt\code\cdn\planrpt\out\production\planrpt\com\lavasoft\cfg\syscfgproperties

  Process finished with exit code

  總結

  使用工程相對路徑是靠不住的

  使用CLASSPATH路徑是可靠的

  對於程序要讀取的文件盡可能放到CLASSPATH下這樣就能保證在開發和發布時候均正常讀取


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27002.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.