`
michael_paul
  • 浏览: 170621 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

java中URL和File的相互转化(转)

阅读更多
原文:http://blog.csdn.net/linjx2004/article/details/5608909

首先,想比较一下这两者的不同。URL用于网络,所以带有明显的protocol,而且对于中文及符号支持的很不好。File就是我们平常系统中的文件路径了,对于中文及符号都支持,但是已经没有protocol了。所以,虽然两者都可以表示文件路径,但是却不能混用了。
典型的URL和File路径的比较:
URL:file:/D:/my%20java/URL&FILE/%e5%9b%be%e7%89%87/tongji.jpg
File:D:/my java/URL&FILE/图片/tongji.jpg
其实两者是一个文件。

回到正题:
这是我在JDK5.0下找到的方法,JDK5.0以下不支持:
URL to File:
URL url=……;
File file=new File(url.toURI);

File to URL:
File file=……;
URL url=file.toURL();



++++++++++++++++++++++++++++

获取JAVA路径,包括CLASSPATH外的路径

归纳一些网上取JAVA路径的方法:
  注明:如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。
  
  得到classpath和当前类的绝对路径的一些方法
  获得CLASSPATH之外路径的方法:
  URL base = this.getClass().getResource(""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/
  String path = new File(base.getFile(), "../../../"+name).getCanonicalPath(); //就可以得到/home/popeye/testjava/name
  下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。
  1.FileTest.class.getResource("")
  得到的是当前类FileTest.class文件的URI目录。不包括自己!
  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/
  2.FileTest.class.getResource("/")
  得到的是当前的classpath的绝对URI路径。
  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
  3.Thread.currentThread().getContextClassLoader().getResource("")
  得到的也是当前ClassPath的绝对URI路径。
  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
  4.FileTest.class.getClassLoader().getResource("")
  得到的也是当前ClassPath的绝对URI路径。
  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
  5.ClassLoader.getSystemResource("")
  得到的也是当前ClassPath的绝对URI路径。
  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
  
我推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法。
  在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。
  注意点:
  1.尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。这是一颗定时bomb,随时可能要你的命。
  2.尽量使用URI形式
  的绝对路径资源。它可以很容易的转变为URI,URL,File对象。
  3.尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。
  4.绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。
  使用硬编码的绝对路径是完全没有必要的!它一定会让你死的很难看!程序将无法移植!
  如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!
  当然,我还是推荐你使用程序得到classpath的绝对路径来拼资源的绝对路径。

=============================================================================

在开发java程序的过程中,我们经常要做的一件事就是获取资源。那么什么是资源呢?说白了,在计算机里那就是一堆数据。只是这堆数据对我们的java程序有多种表现形式,一般来说有File,URL,InputStream等等。而单就文件这一项就有很多种:配置文件,java类文件,jps文件,图片、css、js文件等等。面对这林林总总的资源,我们在设计一个读取资源的接口时,就需要针对不同形式的资源提供方法,这样就导致我们的接口还是与实际的资源形式绑定在一起,未能完全的抽象。另外,在java程序中资源的存放位置也是各异的。有的存放在classpath中,有的存放在文件系统中,有的存放在web应用中。而对于不同位置的资源,java程序获取这些资源的方法各有不同。
A、获取classpath中的资源:
Java代码
URL url = this.getClass().getResource("resource_name"); 
URL url = this.getClass().getClassLoader().getResource("resource_name"); 
URL url = Thread.currentThread().getContextClassLoader().getResource("resource_name"); 

那么在jdk中为什么又提供了三种方式来获取classpath下的资源呢?这其中是有些来头的。
第一行代码中是利用Class类的实例来获取,第二行代码是使用加载当前类的classloader来获取。看下jdk中的源代码会发现class类的实例最后还是委托加载他的classloader来获取资源的。
Java代码
public java.net.URL getResource(String name) { 
    name = resolveName(name); 
    ClassLoader cl = getClassLoader0(); 
    if (cl==null) { 
        // A system class. 
        return ClassLoader.getSystemResource(name); 
    } 
    return cl.getResource(name); 


从上面的代码中可以看出,对于资源的加载并没有像类加载所采用的双亲委托机制。而是当前类的classloader不为null的情况下先从当前类的classloader中加载资源。而只有当前类的classloader为null的时候才从system classloader中去加载资源。这样可以方便我们自定义配置类覆盖一些默认配置。当然,j2se应用中如果没有特别定制classloader时,我们自己写的类都是被system classloader加载的。到底利用class去获取资源和利用classloader去获取资源有什么区别呢?区别就在 resolveName(name)这个方法中。两种方式对于资源名称的表示方式不同。下面是一个简单的包结构,/表示类路径的根
/
|-com.cn.test
   |-Test.class
   |-test2.txt 
|-test1.txt
Java代码
// 获取与当前类在同一个包下的资源 
URL url1 = this.getClass().getResource("test2.txt"); 
// 获取com.cn.test包下的资源,需加/ 
URL url2 = this.getClass().getResource("/com/cn/test/test2.txt"); 
// 获取类路径根下的资源 
URL url3 = this.getClass().getClassLoader().getResource("test1.txt"); 
// 获取包com.cn.test包下的资源 
URL url4 = this.getClass().getResource("com/cn/test/test2.txt"); 

而第三利用当前线程的contextClassLoader来获取资源的解释可以参考我的另一篇
B、获取文件系统中的资源
Java代码
// 1、获得File对象 
File file = new File("test.txt"); 
// 2、获得File对象的字节流 
InputStream in = new FileInputStream(file); 

值得注意的是在File的构造函数File(String name) 中的name参数可以是相对路径和绝对路径。相对路径是相对于System.getProperties("user.dir")的。
C、获取web应用中的资源
Java代码
servletContext.getResourceAsStream(resource_name); 

resource_names为相对于webroot的路径表示。例如获取web.xml,resource_name表示为"/WEB-INF/web.xml"

    面对上面介绍的各种资源表现形式和存放位置,难道java中就没有提供一个统一处理方式吗?有,java.net.URL。
从名称上来看 URL(Uniform Resource Locator) 统一资源定位器。看起来很好很强大。但很多时候使用它并不能定位到我们需要的资源。
    首先,它jdk中体统的URL能访问的协议非常有限(当然可以进行扩展,不过很麻烦);常用的有http,file,ftp等等。并没有提供对classpath和servletContext中的资源的获取方法。
    另外,它没有提供判断资源是否存在的方法。每次只有等我们真正去获取资源的时候抛出异常才能知道资源无法获取。
    其次,URL这个类的职责未划分清楚,既用来表示资源有用来获取其资源。
分享到:
评论

相关推荐

    URL转PDF / HTML转PDF

    实现一个转pdf的功能。 phantomjs 相比 wkhtmltopdf 体积小,转换完整度高。 phantomjs 相比 IText ,支持URL 转换PDF、 转换完整度高。 经过比较,我觉得phantomjs是转化比较好的。 以上提供一个简易的demo,...

    Java2实用教程.rar

    5 3字符串与基本数据的相互转化 5 4对象的字符串表示 5 5StringTokenizer类 5 6字符串与字符 字节数组 5 7StringBuffer类 5 8正则表达式 习题 第6章时间 日期和数字 6 1Date类 6 2Calendar类 6 3Math类 6 4...

    JAVA基础课程讲义

    基本类型转化时常见错误和问题 33 方法 33 简单的键盘输入和输出 33 本章思考作业 34 上机操作 34 第二章(2) 控制语句 35 顺序结构 35 选择结构 35 if单选择结构 35 if-else双选择结构 35 If-elseif-else多选择结构 ...

    UMLparser:将Java源代码转换为类图的解析器

    解析器的主要功能是读取提供的源路径中的所有Java源代码或所有Java文件,并最终生成可被UML生成器解释的语法。 yUML:处理生成最终类图的部分。 Java解析器创建语法,使用该语法创建哪个url,最后使用哪个语法使用...

    疯狂JAVA讲义

    1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 学生提问:为什么不安装公共JRE系统呢? 9 1.4.2 设置...

    Android开发人员不得不收集的代码

    App相关→AppUtils.java 安装App installApp 卸载指定包名的App uninstallApp 获取当前App信息 getAppInfo 获取所有已安装App信息 getAllAppsInfo 根据包名判断App是否安装 isInstallApp 打开指定包名的App ...

    Android项目源码简单利用jsoup爬取学校内网数据

    主要思路就是利用jsoup爬数据把数据转化json。为了保护隐私作者已经把服务端的url去掉了。所以目前不能登录了,不过还可以通过代码研究别人的实现方式和布局。javaapk之前也介绍过5个类似的教务项目,在搜素“教务”...

    unapkm-android:一个实用的应用程序,可将apkm文件转换为Android上的apk

    要使用该应用程序,请使用您最喜欢的文件管理器中的UnApkm打开apkm文件。 系统将提示您输入保存位置。 快速开始 安装 可以通过JitPack获得适用于Android的UnApkm。 // Top level build file repositories { maven...

    ASP200问.EXE

    163.如何在ASP中调用Java类 164.如何在线压缩和解压缩WinRAR文件 第11章 综合开发 166.如何实现聊天室功能 167.如何实现网上投票调查 168.如何实现购物车功能 169.如何实现在线影音播放 170.如如何实现论坛功能 ...

    net学习笔记及其他代码应用

    protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 2 .列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString,...

    Android HttpURLConnection下载网络图片设置系统壁纸

    壁纸是url链接,get就能请求到,所以就用get请求到图片,把图片转化为bitmap,然后设置壁纸。 代码: 这里我封装了工具类 package xxxxx.utils; import android.app.Activity; import android.app.WallpaperManager...

    asp.net知识库

    实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP...

    MyMoudle:首先尝试我的依赖

    使用jitpack进行操作,如果需要引入,则需要以下步骤,... Add the JitPack repository to your build fileAdd it in your root build.gradle at the end of repositories:allprojects {repositories {...maven { url '...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    与Java和Perl不同,你不必把头埋进100多页的文档中努力学习才可以写出一个象样的程序。只要了解一些基本的语法和语言特色,你就可以开始你的PHP编码之旅了。之后你在编码过程中如果遇到了什么麻烦,还可以再去翻阅...

    ZendFramework中文文档

    7.5.5. 基本 URL 和子目录 7.5.6. Route Types 7.5.6.1. Zend_Controller_Router_Route 7.5.6.1.1. 变量缺省 7.5.6.1.2. 变量请求 7.5.6.2. Zend_Controller_Router_Route_Static 7.5.6.3. Zend_Controller_...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    DTD是"有效XML文档"的必须文件,我们通过DTD文件来定义文档中元素和标识的规则及相互关系。如何建立一个DTD文件呢?让我们一起来学习: 1.设置元素 元素是XML文档的基本组成部分。你要在DTD中定义一个元素,然后...

    测试培训教材

    注:由于Cruise Booking的测试是由Cruise Booking的需求转化而成的,所以需求覆盖中默认就覆盖了Cruise Booking的需求项 添加对“View Reservations”需求项的覆盖 -- Linking Tests to a Requiremnet 将测试...

Global site tag (gtag.js) - Google Analytics