关于Java对相对目录的文件读写和调用方法的一些总结
首先要讲Java路径
Java中使用的路径,分为两种:绝对路径和相对路径。具体而言,又分为四种:
1.本地系统的绝对路径:
如: windows: C:\abc\ projectName\bin\def. properties
Linux: /us/home/name/projectName/bin/def.properties
Java.io包中的类,需要使用这种形式的参数。但是,它们一般也提供了URI类型的参数,而URI类型的参数,接受的是URI样式的String。因此,通过URI转换,还是可以把URI样式的绝对路径用在java.io包中的类中。
2.URI形式的绝对资源路径
如:file:/C:/abc/def.properties
URL是URI的特例。URL的前缀/协议,必须是Java熟悉的。URL可以打开资源,而URI则不行。URL和URI对象可以互相转换,使用各自的toURI(),toURL()方法即可!
3.相对于classpath的相对路径
如:相对于file:/C:/abc/projectName/bin/def. properties/ 这个路径的相对路径。其中,bin是本项目的classpath。所有的Java源文件编译后的.class文件复制到这个目录中。还要知道src是java文件的目录,一般的IDE会将src里面的文件都编译放到指定的目录,默认就是项目的bin目录下
4.相对于当前用户目录的相对路径
就是相对于System.getProperty("user.dir")返回的路径。
对于一般项目,这是项目的根路径。对于JavaEE服务器,这可能是服务器的某个路径。这个并没有统一的规范!所以,绝对不要使用"相对于当前用户目录的相对路径"。然而默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。这就是说,在使用java.io包中的类时,最好不要使用相对路径。否则,虽然在J2SE应用程序中可能还算正常,但是到了J2EE程序中,一定会出问题!而且这个路径,在不同的服务器中都是不同的!
然后获取文件路径
说完了路径问题现在就要到了使用java类操作自己项目下的文件了进行操作,以properties文件为例,要学会变通。
那么我们现在来看一下可以使用那些类来获取到我们.java文件 ,或者叫 .class文件的目录了
现在你可以想象,我现在在哪个这个java类里面的代码,那我可以使用IO流把文件读取出来,那么就是利用我现在所在的这个类调用JDK里面的方法,来找出相对于我这个类的文件地址,它是这个类的同一个目录还是在项目的某个位置,如果不是相对的话,那么你就必须每次都需要修改代码来确定文件的位置,这是不明智的选择,所以还是利用相对路径来找到相对应的文件 :这里我要用到这3个类:
java.lang.System
java.lang.ClassLoader
java.lang.Class
1. java.lang.System
方法: public static String getProperty(String key)
例如:System.getProperty("user.dir");
上面方法在JSE环境(JDK6.0_23)下使用运行结果是项目的文件夹的绝对路径;在web系统中就不能确定,好像网上说每个说法,建议少用,因为下面 的更好用。
2. java.lang.ClassLoader
方法1 :public URL getResource(String name)
查询JDK可以知道ClassLoader使用的是 ClassLoader中的URL findResource(String name)方法来获得当前类.class的classpath的,所以要注意的就是传只name的时候你输入的是的路径是相对于classpath的,即:你的类才packet com下,你写name="def.properties"时候,ClassLoader会找classpath下的def.properties文件 ,而不会去找自己packet下的 com/def.properties文件,如果你想用ClassLoader来读取com/def.properties文件,那么你的name应该是name="com/def.properties",而不是name="/com/def.properties",如果写成name="/com/def.properties",那么将会错误,这个地方要注意的,为什么就要自己看文档了,我也有点糊涂,但你说为什么有些地方写成"/com/def.properties",那是因为调用的是ClassLoader中的public static URL getSystemResource(String name),这个下面会讲到,如果还是要问这个不行,那你可以尝试两个方法ClassLoader().getResource("/")和class.getResource("/"),前面的为空值,后面的就是classpath了,更多的还是自己去尝试。
讲了ClassLoader获取路径问题那么就该讲如果新建ClassLoader,
1.你可以直接使用ClassLoader,即ClassLoader.getResource("");
2.可以用当前的Class类来获得Test.class.getClassLoader().getResource("");Test就是当前的类
3.可以当前线程: Thread.currentThread().getContextClassLoader().getResource("")
上面3种方法都是获得classpath目录,想指定文件直接相对与classpath来进行修改字符串,注意上面提到的路径问题
方法 2:public InputStream getResourceAsStream(String name)
路径解释和获得方法都一样,但是返回值是一个InputStream这个在文件操作中比较常用
3. java.lang.Class
方法1 :public URL getResource(String name)
这里主要解释的就是 Class虽然都是使用ClassLoader实现但是使用的方法不一样,查看JDK文档可以发现Class使用的是ClassLoader.getSystemResource(java.lang.String)方法实现,这就是Class类中传递String name的值存在差异了Class的getResource方法的name字符串如果如果以"/"起始那么就是代表classpath目录,如果没有"/"标志开头,那么就是相对于我当前这个类目录来和字符串拼接,这就是差别。
但是发现,如果你直接调用ClassLoader.getSystemResource(java.lang.String),也不能使用以"/"的标志,可能是 加载器和类的不同把吧,这个也是要注意的。
class的获取应该不用我说了吧。
方法 2:public InputStream getResourceAsStream(String name)
这个方法和上面的差不多,我也不多说了。
总结一下,文件相对路径的读取应该就这么多了,文件流都出来了,还有什么是不能解决的呢,如何对properties的读取这个就不教了,还是你们自己上网找资料吧。
上面所讲的JSE文件读取,到了JEE,WEB目录下文件上传,下载对文件操作读取还没讲到,到时后再上网差一下资料,总结一些和大家分享吧。
文章写的不好还希望各位见谅,有错的提醒我,让我也少走弯路。
《备注:个人参考了很多网上资料,那个是原版就不知道了,所以没有出处》
来源:oschina
链接:https://my.oschina.net/u/115986/blog/32423