【转】Java相对路径读取文件

转自:http://lavasoft.blog.51cto.com/62575/265821/
 

原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处  、作者信息和本声明。否则将追究法律责任。 http://lavasoft.blog.51cto.com/62575/265821
Java相对路径读取文件
 
不管你是新手还是老鸟,在程序中读取资源文件总会遇到一些找不到文件的问题,这与Java底层的实现有关,不能算bug,只要方法得当,问题还是可以解决的。
 
项目的文件夹结构:
repathtest 
├─src 
│        └─com 
│                        └─lavasoft 
│                                        ├─test 
│                                        └─res 
├─doc
 
 
 
1、在Java开发工具的project中使用相对路径
在project中,相对路径的根目录是project的根文件夹,在此就是repathtest文件夹了。
创建文件的写法是:
File f =  new  File( "src/com/lavasoft/res/a.txt");
 
File f =  new  File( "doc/b.txt");
 
注意:
路径不以“/”开头;
脱离了IDE环境,这个写法就是错误的,也并非每个IDE都如此,但我见到的都是这样的。
 
2、通过CLASSPATH读取包内文件
读取包内文件,使用的路径一定是相对的classpath路径,比如a,位于包内,此时可以创建读取a的字节流:
InputStream in = ReadFile. class.getResourceAsStream( "/com/lavasoft/res/a.txt");
有了字节流,就能读取到文件内容了。
 
注意:
这里必须以“/”开头;
 
3、看看完整的测试代码
package  com.lavasoft.test; 

import  java.io.*; 

 
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---------------------"); 
                                Filef =  new  File( "src/com/lavasoft/res/a.txt"); 
                                Stringa = file2String(f,  "GBK"); 
                                System.out.println(a); 
               

                 
                public  static  void  readTextB_ByProjectRelativePath(){ 
                                System.out.println( "-----------------readTextB_ByProjectRelativePath---------------------"); 
                                Filef =  new  File( "doc/b.txt"); 
                                Stringb = file2String(f,  "GBK"); 
                                System.out.println(b); 
               


                 
                public  static  void  readTextA_ByClassPath(){ 
                                System.out.println( "-----------------readTextA_ByClassPath---------------------"); 
                                InputStreamin = ReadFile. class.getResourceAsStream( "/com/lavasoft/res/a.txt"); 
                                Stringa = stream2String(in,  "GBK"); 
                                System.out.println(a); 
               

                 
                public  static  Stringfile2String(File f, String charset) { 
                                Stringresult =  null
                                try 
                                                result= stream2String( new  FileInputStream(f),charset); 
                                catch  (FileNotFoundExceptione) { 
                                                e.printStackTrace(); 
                               
                                return  result; 
               

                 
                public  static  Stringstream2String(InputStream in, String charset){ 
                                StringBuffersb =  new  StringBuffer(); 
                                try 
                                                Readerr =  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  (UnsupportedEncodingExcep tione) { 
                                                e.printStackTrace(); 
                                catch  (FileNotFoundExceptione) { 
                                                e.printStackTrace(); 
                                catch  (IOExceptione) { 
                                                e.printStackTrace(); 
                               
                                return  sb.toString(); 
               
}
(代码写得粗糙,异常没做认真处理)
 
运行结果:
-----------------readTextA_ByClassPath--------------------- 
aaaaaaaaa 
sssssssss 
-----------------readTextA_ByProjectRelativePath--------------------- 
aaaaaaaaa 
sssssssss 
-----------------readTextB_ByProjectRelativePath--------------------- 
bbbbbbbbbbb 

Process finished with exit code 0
 
这是通过IDEA开发工具运行的,结果没问题,如果换成控制台执行,那么使用了项目相对路径的读取方式会失败,原因是,此时已经脱离了项目的开发环境,-----这个问题常常困扰着一些菜鸟,代码在开发工具好好的,发布后执行就失败了!
下面我截个图:
 
5、获取CLASSPATH下文件的绝对路径
当使用相对路径写入文件时候,就需要用到绝对路径。下面是个例子:
package  com.lavasoft; 

import  java.io.File; 

 
public  class  Test{ 
                //classpath的文件路径 
                private  static  Stringcp =  "/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文件的绝对路径 
                                Filef =  new  File(Test. class.getResource(cp).getFile()); 
                                System.out.println(f.getPath()); 
               
}
 
 
输出:
/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下,这样就能保证在开发和发布时候均正常读取。
 
-----------------------
推荐资源:

本文出自 “熔 岩”博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/265821

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值