1、在Java开发工具的project中使用相对路径

在project中,相对路径的根目录是project的根文件夹,在此就是repathtest文件夹了。

创建文件的写法是:



[Java] 纯文本查看 复制代码




​?​



1




​File f = ​​​​new​​ ​​File(​​​​"src/com/lavasoft/res/a.txt"​​​​);​



 



[Java] 纯文本查看 复制代码




​?​



1




​File f = ​​​​new​​ ​​File(​​​​"doc/b.txt"​​​​);​



注意:

路径不以“/”开头;

脱离了IDE环境,这个写法就是错误的,也并非每个IDE都如此,但我见到的都是这样的。


2、通过CLASSPATH读取包内文件

读取包内文件,使用的路径一定是相对的classpath路径,比如a,位于包内,此时可以创建读取a的字节流:



[Java] 纯文本查看 复制代码




​?​



1




​InputStream in = ReadFile.​​​​class​​​​.getResourceAsStream(​​​​"/com/lavasoft/res/a.txt"​​​​);​



有了字节流,就能读取到文件内容了。


注意:

这里必须以“/”开头;

3、看看完整的测试代码:



[Java] 纯文本查看 复制代码




​?​



01


02


03


04


05


06


07


08


09


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53


54


55


56


57


58


59


60


61


62


63


64


65


66


67


68


69


70


71


72


73


74


75


76


77


78


79


80


81


82


83


84


85


86


87


88


89




​ackage com.lavasoft.test; ​


 


​import​​ ​​java.io.*; ​


 


​/** ​


​* Java读取相对路径的文件 ​


​* ​


​*/​


​public​​ ​​class​​ ​​ReadFile { ​


​public​​ ​​static​​ ​​void​​ ​​main(String[] args) { ​


​readTextA_ByClassPath(); ​


​readTextA_ByProjectRelativePath(); ​


​readTextB_ByProjectRelativePath(); ​


​} ​


 


​/** ​


​* 通过工程相对路径读取(包内)文件,注意不以“/”开头 ​


​*/​


​public​​ ​​static​​ ​​void​​ ​​readTextA_ByProjectRelativePath() { ​


​System.out.println(​​​​"-----------------readTextA_ByProjectRelativePath---------------------"​​​​); ​


​File f = ​​​​new​​ ​​File(​​​​"src/com/lavasoft/res/a.txt"​​​​); ​


​String a = file2String(f, ​​​​"GBK"​​​​); ​


​System.out.println(a); ​


​} ​


 


​/** ​


​* 通过工程相对路径读取(包外)文件,注意不以“/”开头 ​


​*/​


​public​​ ​​static​​ ​​void​​ ​​readTextB_ByProjectRelativePath() { ​


​System.out.println(​​​​"-----------------readTextB_ByProjectRelativePath---------------------"​​​​); ​


​File f = ​​​​new​​ ​​File(​​​​"doc/b.txt"​​​​); ​


​String b = file2String(f, ​​​​"GBK"​​​​); ​


​System.out.println(b); ​


​} ​


 


 


​/** ​


​* 通过CLASSPATH读取包内文件,注意以“/”开头 ​


​*/​


​public​​ ​​static​​ ​​void​​ ​​readTextA_ByClassPath() { ​


​System.out.println(​​​​"-----------------readTextA_ByClassPath---------------------"​​​​); ​


​InputStream in = ReadFile.​​​​class​​​​.getResourceAsStream(​​​​"/com/lavasoft/res/a.txt"​​​​); ​


​String a = stream2String(in, ​​​​"GBK"​​​​); ​


​System.out.println(a); ​


​} ​


 


​/** ​


​* 文件转换为字符串 ​


​* ​


​* @param f             文件 ​


​* @param charset 文件的字符集 ​


​* @return 文件内容 ​


​*/​


​public​​ ​​static​​ ​​String file2String(File f, String charset) { ​


​String result = ​​​​null​​​​; ​


​try​​ ​​{ ​


​result = stream2String(​​​​new​​ ​​FileInputStream(f), charset); ​


​} ​​​​catch​​ ​​(FileNotFoundException e) { ​


​e.printStackTrace(); ​


​} ​


​return​​ ​​result; ​


​} ​


 


​/** ​


​* 文件转换为字符串 ​


​* ​


​* @param in            字节流 ​


​* @param charset 文件的字符集 ​


​* @return 文件内容 ​


​*/​


​public​​ ​​static​​ ​​String stream2String(InputStream in, String charset) { ​


​StringBuffer sb = ​​​​new​​ ​​StringBuffer(); ​


​try​​ ​​{ ​


​Reader r = ​​​​new​​ ​​InputStreamReader(in, charset); ​


​int​​ ​​length = ​​​​0​​​​; ​


​for​​ ​​(​​​​char​​​​[] c = ​​​​new​​ ​​char​​​​[​​​​1024​​​​]; (length = r.read(c)) != -​​​​1​​​​;) { ​


​sb.append(c, ​​​​0​​​​, length); ​


​} ​


​r.close(); ​


​} ​​​​catch​​ ​​(UnsupportedEncodingException e) { ​


​e.printStackTrace(); ​


​} ​​​​catch​​ ​​(FileNotFoundException e) { ​


​e.printStackTrace(); ​


​} ​​​​catch​​ ​​(IOException e) { ​


​e.printStackTrace(); ​


​} ​


​return​​ ​​sb.toString(); ​


​} ​


​}​





运行结果:



[Java] 纯文本查看 复制代码




​?​



01


02


03


04


05


06


07


08


09


10




​-----------------readTextA_ByClassPath--------------------- ​


​aaaaaaaaa ​


​sssssssss ​


​-----------------readTextA_ByProjectRelativePath--------------------- ​


​aaaaaaaaa ​


​sssssssss ​


​-----------------readTextB_ByProjectRelativePath--------------------- ​


​bbbbbbbbbbb ​


 


​Process finished with exit code ​​​​0​



这是通过IDEA开发工具运行的,结果没问题,如果换成控制台执行,那么使用了项目相对路径的读取方式会失败,原因是,此时已经脱离了项目的开发环境,-----这个问题常常困扰着一些人,代码在开发工具好好的,发布后执行就失败了!



5、获取CLASSPATH下文件的绝对路径

当使用相对路径写入文件时候,就需要用到绝对路径。下面是个例子:



[Java] 纯文本查看 复制代码




​?​



01


02


03


04


05


06


07


08


09


10


11


12


13


14


15


16


17


18


19


20


21


22


23




​package​​ ​​com.lavasoft; ​


 


​import​​ ​​java.io.File; ​


 


​/** ​


​* CLASSPATH文件的绝对路径获取测试 ​


​* ​


​* @author leizhimin 2010-1-18 9:33:02 ​


​*/​


​public​​ ​​class​​ ​​Test { ​


​//classpath的文件路径 ​


​private​​ ​​static​​ ​​String cp = ​​​​"/com/lavasoft/cfg/syscfg.properties"​​​​; ​


 


​public​​ ​​static​​ ​​void​​ ​​main(String[] args) { ​


​//当前类的绝对路径 ​


​System.out.println(Test.​​​​class​​​​.getResource(​​​​"/"​​​​).getFile()); ​


​//指定CLASSPATH文件的绝对路径 ​


​System.out.println(Test.​​​​class​​​​.getResource(cp).getFile()); ​


​//指定CLASSPATH文件的绝对路径 ​


​File f = ​​​​new​​ ​​File(Test.​​​​class​​​​.getResource(cp).getFile()); ​


​System.out.println(f.getPath()); ​


​} ​


​}​





输出:



[Java] 纯文本查看 复制代码




​?​



1


2


3


4


5




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


​/D:/projects/bbt/code/cdn/planrpt/out/production/planrpt/com/lavasoft/cfg/syscfg.properties ​


​D:\projects\bbt\code\cdn\planrpt\out\production\planrpt\com\lavasoft\cfg\syscfg.properties ​


 


​Process finished with exit code ​​​​0​




总结

使用工程相对路径是靠不住的。

使用CLASSPATH路径是可靠的。

对于程序要读取的文件,尽可能放到CLASSPATH下,这样就能保证在开发和发布时候均正常读取