java读取文件的两种方法:java.io和java.lang.ClassLoader

本文对比了java.io和java.lang.ClassLoader两种文件读取方法的特点和适用场景,并详细解释了在Java EE环境下如何选择合适的读取方式。同时,还介绍了在打包为jar文件时如何正确读取配置文件。
java读取文件的两种方法:java.io和java.lang.ClassLoader

什么时候使用java.io,什么时候使用java.lang.ClassLoader呢?
(注:要是之前读xml文件时清晰知道java读取文件有这两种方法就好了!可以少走很多去理解相对路径
的弯路!)

自己的总结:
*java.io:相对于当前用户目录的相对路径读取;注重与磁盘文件打交道或者纯java project中使用。
(虽然ClassLoader方式更通用,但是如果不是javaEE环境,要定位到classpath路径下去读文件是不合理
的。)
*java.lang.ClassLoader:相对于classpath的相对路径读取;建议在javaEE环境中都使用这种方式。


整理资料一:http://www.code168.com/bbs/html/2005-12-9/23554625833.html
问:
java打成jar包的后续问题!!!!如何在读取jar包里面的配置文件?
答1:
如果用java.util.ResourceBundle就不用担心什么,它本来就是从class  loader  folder/jar文件里找
properties文件。 
如果你已经注意到了,java取文件有两种方法,java.util.io和java.lang.ClassLoader两种。 
java.io: 
     File  file  =  new  File("..."); 
     FileInputStream  fis  =  new  FileInputStream("..."); 
     FileReader  fr  =  new  FileReader("..."); 
ClassLoader: 
     ClassLoader  loader  =  XXXClass.class.getClassLoader(); 
     or 
     ClassLoader  loader  =  Thread.currentThread().getContextClassLoader(); 
     URL  url  =  loader.getResource("..."); 
     File  file  =  new  File(url.getFile()); 
     InputStream  input  =  loader.getResourceAsStream("..."); 
这两种,一种是从project  loader  folder取,一种是从class  loader  folder取,class  loader 
folder包括jar文件。 
我想你应该明白了吧?自己写个程序test一下就知道了。

答2:
File  file  =  new  File(url.getFile());不是用在你这种情况的。 
一般情况既然classloader已经拿到resource,就没有必要画蛇添足地再转成File. 
转成File事实上是为了拿到绝对路径,我们碰到过这么一种情况。 
一个Web  application,用tomcat启动,tomcat会建一个application  folder,folder下面有一个web-inf

 folder,再下面是classes目录,classes目录下面是所有的java  classes.程序需要用一个property文件

记录数据,用io  package只能定位到绝对路径,用class  loader可以是相对路径,不管tomcat在客户电

脑上任何位置,但是,如果写文件在classes  folder下面,tomcat会reload  web  server,页面会重载

。为了定位到application  folder,与web-inf并列,先用classloader,再转成file拿到全路径,去掉后

面不需要的folder,就可以拿到 tomecat建的web  application的绝对路径。 
与你的情况不同的是,classloader定位到的文件,不在jar里头。我认为用java  io不可以定到jar里面



整理资料二:
Java路径问题最终解决方案
http://www.matrix.org.cn/thread.shtml?topicId=6d0bbeed-9157-11db-ab77-

2bbe780ebfbf&forumId=19

一、相对于当前用户目录的相对路径
就是相对于System.getProperty("user.dir")返回的路径。
对于一般项目,这是项目的根路径。对于JavaEE服务器,这可能是服务器的某个路径。这个并没有统一的

规范!
所以,绝对不要使用“相对于当前用户目录的相对路径”。然而:
默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir

指定,通常是 Java 虚拟机的调用目录。
这就是说,在使用java.io包中的类时,最好不要使用相对路径。否则,虽然在J2SE应用程序中可能还算

正常,但是到了J2EE程序中,一定会出问题!而且这个路径,在不同的服务器中都是不同的!

二、相对于classpath的相对路径
如:相对于
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/这个路径的相对路径。其中,bin是本项目的

classpath。所有的Java源文件编译后的.class文件复制到这个目录中。


三、相对路径最佳实践
推荐使用相对于当前classpath的相对路径
因此,我们在使用相对路径时,应当使用相对于当前classpath的相对路径。
ClassLoader类的getResource(String name),getResourceAsStream(String name)等方法,使用相对于当

前项目的classpath的相对路径来查找资源。
读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。
通过查看ClassLoader类及其相关类的源代码,我发现,它实际上还是使用了URI形式的绝对路径。通过得

到当前classpath的URI形式的绝对路径,构建了相对路径的URI形式的绝对路径。(这个实际上是猜想,

因为JDK内部调用了SUN的源代码,而这些代码不属于JDK,不是开源的。)

四、相对路径本质上还是绝对路径
因此,归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是

一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的! 

Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=2112714

 
引入 <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-boringssl-static</artifactId> <version>2.0.56.Final</version> <!-- 兼容 Netty 4.1.77.Final --> <classifier>linux-x86_64</classifier> </dependency>后报Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) Caused by: java.lang.UnsatisfiedLinkError: failed to load the required native library at io.netty.handler.ssl.OpenSsl.ensureAvailability(OpenSsl.java:596) at io.netty.handler.ssl.SslContext.newClientContextInternal(SslContext.java:830) at io.netty.handler.ssl.SslContextBuilder.build(SslContextBuilder.java:611) at org.chainmaker.sdk.RpcServiceClient.initManagedChannel(RpcServiceClient.java:160) at org.chainmaker.sdk.RpcServiceClient.<init>(RpcServiceClient.java:83) at org.chainmaker.sdk.RpcServiceClient.newServiceClient(RpcServiceClient.java:91) at org.chainmaker.sdk.GrpcClientFactory.createRpcClient(GrpcClientFactory.java:126) at org.chainmaker.sdk.GrpcClientFactory.create(GrpcClientFactory.java:109) at org.chainmaker.sdk.GrpcClientFactory.create(GrpcClientFactory.java:21) at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:70) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:571) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:298) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:223) at org.chainmaker.sdk.ChainClient.sendTxRequest(ChainClient.java:2778) at org.chainmaker.sdk.ChainClient.sendRequest(ChainClient.java:3201) at org.chainmaker.sdk.ChainClient.proposalRequest(ChainClient.java:3107) at org.chainmaker.sdk.ChainClient.getChainConfig(ChainClient.java:1103) at com.carbonfootprint.common.maker.configure.ChainConfig.getChainConfig(ChainConfig.java:11) at com.carbonfootprint.portalmgmt.CarbonFootprintPortalMgmtApplication.main(CarbonFootprintPortalMgmtApplication.java:32) ... 8 more Caused by: java.lang.IllegalArgumentException: Failed to load any of the given libraries: [netty_tcnative_linux_x86_64, netty_tcnative_linux_x86_64_fedora, netty_tcnative_x86_64, netty_tcnative] at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:114) at io.netty.handler.ssl.OpenSsl.loadTcNative(OpenSsl.java:705) at io.netty.handler.ssl.OpenSsl.<clinit>(OpenSsl.java:146) at io.grpc.netty.GrpcSslContexts.configure(GrpcSslContexts.java:169) at org.chainmaker.sdk.RpcServiceClient.getSslContextBuilder(RpcServiceClient.java:204) at org.chainmaker.sdk.RpcServiceClient.initManagedChannel(RpcServiceClient.java:147) ... 23 more Suppressed: java.lang.IllegalStateException: Multiple resources found for 'META-INF/native/libnetty_tcnative_linux_x86_64.so' with different content: [jar:file:/app/run.jar!/BOOT-INF/lib/netty-tcnative-openssl-static-2.0.39.Final.jar!/META-INF/native/libnetty_tcnative_linux_x86_64.so, jar:file:/app/run.jar!/BOOT-INF/lib/netty-tcnative-boringssl-static-2.0.52.Final-linux-x86_64.jar!/META-INF/native/libnetty_tcnative_linux_x86_64.so] at io.netty.util.internal.NativeLibraryLoader.getResource(NativeLibraryLoader.java:301) at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:173) at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:105) ... 28 more Suppressed: java.lang.UnsatisfiedLinkError: could not load a native library: netty_tcnative_linux_x86_64_fedora at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:239) at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:105) ... 28 more Caused by: java.io.FileNotFoundException: META-INF/native/libnetty_tcnative_linux_x86_64_fedora.so at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:186) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative_linux_x86_64_fedora in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:391) at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:161) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative_linux_x86_64_fedora in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:425) at java.security.AccessController.doPrivileged(Native Method) at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:417) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:383) ... 30 more Suppressed: java.lang.UnsatisfiedLinkError: could not load a native library: netty_tcnative_x86_64 at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:239) at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:105) ... 28 more Caused by: java.io.FileNotFoundException: META-INF/native/libnetty_tcnative_x86_64.so at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:186) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative_x86_64 in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:391) at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:161) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative_x86_64 in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:425) at java.security.AccessController.doPrivileged(Native Method) at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:417) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:383) ... 30 more Suppressed: java.lang.UnsatisfiedLinkError: could not load a native library: netty_tcnative at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:239) at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:105) ... 28 more Caused by: java.io.FileNotFoundException: META-INF/native/libnetty_tcnative.so at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:186) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:391) at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:161) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:425) at java.security.AccessController.doPrivileged(Native Method) at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:417) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:383) ... 30 more
最新发布
12-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值