原文: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这个类的职责未划分清楚,既用来表示资源有用来获取其资源。
分享到:
相关推荐
实现一个转pdf的功能。 phantomjs 相比 wkhtmltopdf 体积小,转换完整度高。 phantomjs 相比 IText ,支持URL 转换PDF、 转换完整度高。 经过比较,我觉得phantomjs是转化比较好的。 以上提供一个简易的demo,...
【描述】:在Java开发中,经常需要处理不同地理数据格式的转换,特别是GeoJSON和Geometry SHP格式之间的互换。本篇文章将对这两种格式的数据转换过程进行详尽的阐述,并结合PDF文档中的总结,为开发者提供实用的参考...
这个"Java实现字节流与图片的转化Java实用源码整理learn"资料包,很显然,提供了关于如何在Java中进行这种转化的源代码实例。 首先,让我们了解字节流的基本概念。字节流分为输入流和输出流,它们分别是InputStream...
1. **文件读取和解压**:使用`java.nio.file.Files`读取文件内容,如果是`.docx`、`.xlsx`,则解压到内存或临时目录。 2. **XML解析**:使用`javax.xml.parsers.DocumentBuilderFactory`和`DocumentBuilder`解析XML...
这在实际应用中非常有用,例如,将二维码作为URL的一部分,或者在服务器端生成二维码并以Base64形式返回给前端展示。理解并掌握这些技术,对于进行Java相关的Web开发或者移动应用开发都是非常有益的。
前端接收到图片的二进制数据后,可以通过`Blob`和`URL.createObjectURL()`将数据转化为URL,然后在HTML中设置`<img>`标签的`src`属性。例如: ```javascript let imgBlob = new Blob([response.data], {type: '...
本篇将详细介绍如何在Java中实现这一功能,特别是在遇到需要下载证书的情况。 首先,你需要引入Java的HTTPS相关的库,这通常包含在`javax.net.ssl`包中。Java的`HttpURLConnection`类是处理HTTP和HTTPS请求的基础,...
import java.net.URL; public class HtmlToPdfWithStamp { public static void main(String[] args) { String htmlFilePath = "your_html_file.html"; String stampImagePath = "your_stamp_image.png"; ...
- **编译阶段**:使用JDK中的javac编译器将.java源文件转化为.class字节码文件。javac默认使用UTF-8编码读取源文件,但可以通过设置`-encoding`参数指定其他编码。 - **执行阶段**:Java虚拟机(JVM)加载并运行....
首先,需要引入必要的jar包,包括java.awt.image.BufferedImage、java.io.ByteArrayOutputStream、java.io.File、java.io.FileOutputStream、java.net.MalformedURLException、java.net.URL、javax.imageio.ImageIO...
在Java中实现Base64编码,我们可以使用内置的`java.util.Base64`类,这个类提供了方便的方法来进行Base64的编码和解码。 Base64编码的原理是将每3个字节(24位)的数据分为4组,每组6位。由于ASCII码是7位的,因此6...
在本文中,我们将深入探讨如何使用科大讯飞的语音识别技术与Java编程语言结合,以实现将输入的音频文件转换为可编辑的文字内容。科大讯飞是中国领先的语音技术提供商,其API提供了高效且准确的语音转文本功能,广泛...
在Java开发中,处理PDF文件是一项常见的任务,包括上传、下载、在线预览、删除以及修改等操作。这里我们将深入探讨这些功能的实现,并结合标签`java xpdf java实现pdf`来讨论XPDF库在Java中的应用。 1. **PDF上传**...
在Java开发中,有时我们需要将HTML内容转换为PDF格式,以便于打印、存档或方便离线阅读。在这个场景下,ITextRenderer库提供了一个强大的解决方案。ITextRenderer是Apache FOP项目的一部分,它允许我们将XSL-FO(一...
2. **Java**:作为广泛使用的编程语言,Java提供了许多库来处理CSV文件,如OpenCSV、Apache Commons CSV或Java 8内置的`java.nio.file.Files`和`java.util.Scanner`。在这个项目中,你可能需要使用这些库来读取CSV...
在Java中,生成二维码通常会用到第三方库,例如Google的ZXing库,它是一个开源的条码解码和编码库,支持多种条码格式,包括QR码。 ZXing库提供了一些核心类来处理二维码的生成,其中`MultiFormatWriter`类是用于...
在DBFile.java这个文件中,如果涉及数据库操作和JSON转换,可能是对数据库查询结果进行处理,将查询到的数据转化为JSON格式。通常,我们会先执行SQL查询,获取结果集,然后遍历结果集,逐条将数据转化为JSON对象。...
5 3字符串与基本数据的相互转化 5 4对象的字符串表示 5 5StringTokenizer类 5 6字符串与字符 字节数组 5 7StringBuffer类 5 8正则表达式 习题 第6章时间 日期和数字 6 1Date类 6 2Calendar类 6 3Math类 6 4...
import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.security.InvalidParameterException; import org.zefer.pd4ml.PD4Constants; ...