[size=small]java读取文件的两种方法:java.io和java.lang.ClassLoader
什么时候使用java.io,什么时候使用java.lang.ClassLoader呢?[/color]
(注:要是之前读xml文件时清晰知道java读取文件有这两种方法就好了!可以少走很多去理解相对路径
的弯路!)
自己的总结:
*java.io:相对于当前用户目录的相对路径读取;注重与磁盘文件打交道或者纯java project中使用。
(虽然ClassLoader方式更通用,但是如果不是javaEE环境,要定位到classpath路径下去读文件是不合理
的。)
*java.lang.ClassLoader:相对于classpath的相对路径读取;建议在javaEE环境中都使用这种方式。
[color=red]整理资料一:http://www.code168.com/bbs/html/2005-12-9/23554625833.html
问:
java打成jar包的后续问题!!!!如何在读取jar包里面
[/size]的配置文件?
答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(Stringname),getResourceAsStream(String name)等方法,使用相对于当前项目的classpath的相对路径来查找资源。
读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。通过查看ClassLoader类及其相关类的源代码,我发现,它实际上还是使用了URI形式的绝对路径。通过得到当前classpath的URI形式的绝对路径,构建了相对路径的URI形式的绝对路径。(这个实际上是猜想,因为JDK内部调用了SUN的源代码,而这些代码不属于JDK,不是开源的。)
四、相对路径本质上还是绝对路径
因此,归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的![color=blue][/color]
分享到:
相关推荐
以下将详细介绍四种方法来读取`.properties`文件。 ### 方法一:使用`java.util.Properties` Java标准库提供了一个`Properties`类,专门用于处理`.properties`文件。以下是一个简单的示例: ```java import java....
### Java读取Properties文件的六种方法 在Java开发中,`Properties` 文件常用于存储配置信息,如数据库连接字符串、应用配置等。正确且高效地读取这些配置文件对于程序运行至关重要。本文将详细介绍六种不同的方法...
例如,可以使用`java.lang.ClassLoader`的`getResource`或`getResourceAsStream`方法,或者使用`java.io.File`类来处理文件路径。 一个简单的获取路径实现如下: ```java URL resource = ClassLoader....
首先调用`loadClassData()`方法从文件系统读取类文件数据,然后使用`defineClass()`方法将二进制数据转换为`Class`对象。 - **`loadClassData()`方法**:从文件系统中读取类文件数据,返回类文件的字节数组。 #### ...
2. bio、nio 和 aio 的区别、三种 IO 的用法与原理 3. netty 反射 1. 反射与 javassist 2. 反射与工厂模式、java.lang.reflect.* 序列化 1. 什么是序列化与反序列化、为什么序列化 2. 序列化底层原理 3. 序列化...
可以使用`java.io`包中的类,如`FileInputStream`,来读取字节码文件。 3. **解密字节码**:如果加壳过程中进行了加密,这里需要进行解密操作,将加密后的字节码还原为原始的字节码。 4. **转换字节码**:可选步骤...
- **`java.io.EOFException`**:当读取文件或流时达到文件末尾但数据还未完全读取完成时抛出。 - **`java.io.FileNotFoundException`**:当尝试打开不存在的文件时抛出。 - **`java.lang.NumberFormatException`**:...
3.9.2 java.lang.ClassLoader和授权 46 3.9.3 java.security.SecureClassLoader 49 3.9.4 java.net.URLClassLoader 49 3.9.5 类的路径 50 3.10 java.lang.SecurityManager 51 3.10.1 使用安全管理器的实例 51 3.10.2...
- **正确处理文件读取:** 在读取文件时,确保能够检测到文件末尾,并妥善处理这种情况。 ```java try (FileInputStream fis = new FileInputStream("file.ser")) { ObjectInputStream ois = new ...
3.9.2 java.lang.ClassLoader和授权 46 3.9.3 java.security.SecureClassLoader 49 3.9.4 java.net.URLClassLoader 49 3.9.5 类的路径 50 3.10 java.lang.SecurityManager 51 3.10.1 使用安全管理器的实例 51 3.10.2...
`java.lang` 包中的 `ClassLoader` 类是Java类加载的核心组件。它的主要职责是在接收到类请求时提供服务。具体而言,当 JVM 需要使用一个类时,它会向 `ClassLoader` 请求该类,随后 `ClassLoader` 尝试返回一个表示...
Java IO系统主要包括文件输入输出流和网络通信流。常用的类包括`FileInputStream`、`FileOutputStream`、`BufferedReader`、`PrintWriter`等。 #### 七、Java集合类 Java集合框架提供了存储和操作一组对象的方式,...
3. **反射机制**:一旦找到类信息,工具类可能会使用Java的反射API(如`java.lang.Class`和`java.lang.reflect.*`)来获取类的元数据,包括类名、方法、字段等。 4. **类路径扫描**:如果`ScanUtil`是为了解决运行...
例如,我们可以使用`java.io.File`类来定位本地文件系统中的jar文件。 3. **读取jar文件**:使用`java.util.jar.JarFile`类打开jar文件,并遍历其中的条目。每个条目对应于jar内的一个文件,如类文件、资源文件等。...
类中可以包含类变量、方法、内部类、内部接口等,抽象类和接口是 Java 中两种特殊的类,抽象类不能直接生成一个实例,接口可以理解为纯抽象的类,它的每个方法都是未实现的。 2. System System 类是 Java 中的一个...
1. Java有八种基本数据类型:byte, short, int, long, float, double, char, boolean。String不是基本数据类型,而是一个对象,它是java.lang.String类的实例。基本数据类型是直接存储值,而String对象存储的是字符...
java.lang.Class 的 forName() 方法有两个形式:`public static Class forName(String className)` 和 `public static Class forName(String className, boolean initialize, ClassLoader loader)`。第一个形式是...