一般我们加载文件都是以下3种方式进行加载,之前一直困扰我很久的关于文件加载的路径问题,今天我想自己写一个wiki page来记录下,总结下:
1,通过类加载器
这种方式是通过java自己的类加载器来加载文件,根目录为java类的打包出来后的根目录。相对目录就是当前类所在的包位置。如果你希望加载的文件是保存在类加载器能访问到的目录,推荐使用此加载方式(web应用中web-inf下的文件出于安全机制的考虑是不能通过web-inf进行加载的)
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath);
2,通过文件系统加载
这种方式是通过系统的文件系统机制进行加载,它接受的参数(文件路径)是一个绝对路径地址,你可能会觉得这样的话文件路径会在代码中hard coding,不优雅,当然你可以选择用很多种方式获得项目的路径再进行相应的相对路径拼装,至少我是这么做的。
InputStream inputStream = new FileInputStream(file);
但是有个很重要的问题需要说明,看下面的例子(在weblogic应用服务器中):
其中使用到了Log4J作为日志输出工具,Log4J的配置文件log4j.propertes放在 DefaultWebApp\WEB-INF目录下。Log4J通过一个自动加载的Servlet进行初始化,初始化代码如下:
ServletContext context = getServletContext();
org.apache.log4j.PropertyConfigurator.
configure(context.getRealPath("/")
+ "/WEB-INF/log4j.properties");
其中,context.getRealPath("/")得到当前Web应用的真实根目录,比如,如果你的WebLogic安装在D:\bea下,在Windows下context.getRealPath("/")通常会返回:D:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp。这样,和 "/ WEB-INF /log4j.properties"拼接后,就得到了log4j.properties文件的真实路径。现在一切正常!测试通过后,将DefaultWebApp下的所有文件打为一个.war包,进行部署时,发现系统报告找不到“D:\bea \wlserver6.1\null\ WEB-INF \log4j.properties”文件!如果你的应用中还需要读取其它已经被打包到war包中的文件,都会报告找不到文件。并且,系统并不会到D:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp 目录下寻找,而会到D:\bea\wlserver6.1\null下寻找。这是因为context.getRealPath("/")返回了null。
查看ServletContext的API文档,原来,
对一个打包的应用来说,是没有RealPath的概念的,调用getRealPath 只会简单地返回null。其实,也很好理解,一个文件被打包入了.war文件,就不存在目录结构了(虽然包中仍然存在目录结构,但这不等同于文件系统中的目录结构)。所以,对war包中的资源是无法得到RealPath的。这样也就无从通过文件IO进行读取了。那么,如何读取war包中的资源呢?答案是使用ServletContext.getResourceAsStream(String)方法。那么,现在对于war应用可以成功运行,但如果现在不通过war部署,直接通过目录结构部署应用会不会又出现找不到资源的错误呢?请来看看 ServletContext.getResourceAsStream的API文档,
# Returns a URL to the resource that is
# mapped to a specified path. The path
# must begin with a "/" and is interpreted
# as relative to the current context root.
# This method allows the servlet container
# to make a resource available to servlets
# from any source. Resources can be located
# on a local or remote file system,
# in a database, or in a .war file.
#
可见,通过
getResourceAsStream可以获取包括本地文件系统、远程文件系统、war包等资源。不会出现上面担心的问题。
结论:在开发J2EE Web应用时,如果需要读取本应用中的文件,尽量使用ServletContext.getResourceAsStream进行,而不要使用文件IO。
getRealPath在不同的服务器中获得的参数是不一样的,有些会返回空,有些会返回正常数据,这就要看服务器是否解包文件了,而且有些服务器中getRealPath是本身就以"/"结尾的,这里是最好进行下判断:
realPath.endsWith("/")?realPath:(realPath+"/")
3,web程序可以通过ServletContext进行加载
一个特定资源的URL可以通过调用ServletContext.getResource(String path)得到,这儿的path参数必须以“/”开始,将被解析为相对于当前Servlet背景的根的相对路径。这个方法有别于基于类加载器的 java.lang.Class.getResource方法。假如你通过ServletContext.getResource方法请求了一个.jsp 页面,你得到的将是JSP的源码,要得到执行结果,可以使用RequestDispatcher对象的include方法。你也可以直接以输入流的形式得到资源,
public InputStream getResourceAsStream(String path);
上个例子已经很好的联合文件io来对2者进行了比较了。
inputStream = sc.getResourceAsStream(EnumConstants.SERVER_CONFIGURATION_FILEPATH.toString());
/**
*"SERVER_CONFIGURATION_FILEPATH" server configuration reflection class properties file path <b>"/config/server-config.properites"
*/
public static final EnumConstants SERVER_CONFIGURATION_FILEPATH = new EnumConstants("/config/server-config.properites");
分享到:
相关推荐
本篇文章将详细探讨Java中加载配置文件的几种常见方式。 1. **使用Properties类** Java标准库中的`java.util.Properties`类是处理.properties文件的主要工具。我们可以使用`Properties.load()`方法从InputStream中...
在本实例中,我们将探讨如何使用Java 3D加载和展示OBJ与3DS格式的3D模型文件,以及如何通过鼠标交互控制模型的视角。 首先,OBJ文件是一种通用的3D模型格式,由Wavefront Technologies开发,广泛用于3D建模软件之间...
通过上述介绍可以看出,在Java中加载文件的方式多种多样,开发者可以根据实际需求选择最适合的方法。无论是基于Java本身的类加载机制还是通过Spring等框架提供的便捷方式,都能够有效地实现资源文件的加载与管理。在...
在Web应用中,可以通过 `ServletContext` 对象获取资源输入流,这通常用于从Web应用的上下文根目录加载文件。示例: ```java // 假设已经有了 ServletContext 对象 context InputStream in = context....
Java3D提供了多种方式来加载3D模型文件,包括从本地文件系统加载、从网络加载、从数据库加载等。加载3D模型文件时,需要使用Java3D提供的加载器(Loader)来读取模型文件的数据。 3. 显示3D模型 加载3D模型文件后...
这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...
这个"Java加载配置文件工具类"很可能是为了解决这个问题而创建的一个实用工具,帮助开发者更方便、高效地处理配置文件。配置文件通常以.properties或.xml格式存在,用于存储应用程序的参数、配置项等。 配置文件的...
在Java编程语言中,动态加载jar文件是一种关键的特性,它允许程序在运行时加载新的类库或组件,而不是在编译时静态地链接。这种技术对于实现插件式开发或者模块化系统至关重要,因为它提供了灵活性和可扩展性。下面...
java通过相对路径或绝对路径加载属性文件。
Java热加载Class文件是开发者在调试和优化代码时非常实用的一种技术,它允许开发者在不重启JVM的情况下更新和替换已加载的类,极大地提高了开发效率。本文将深入探讨Java热加载Class文件的相关知识点。 首先,理解...
加载文件资源的三种方式 ~1.从classpath根目录下加载指定名称的文件 2.从classpath根目录下加载指定名称的文件 3. 从classpath根目录下加载指定名称的文件 4. 获取当前文件的绝对路径
总之,通过Java3D加载OBJ模型涉及到文件解析、3D几何构建、Scene Graph组织以及渲染设置等多个环节。开发者需要对OBJ文件格式和Java3D库有深入理解才能顺利完成这一过程。对于初学者,理解并实现这个流程可能有一定...
通过javacv加载字幕文件,然后跟视频合并。首先使用FFmpegFrameGrabber类加载视频文件和字幕文件。然后创建一个FFmpegFrameRecorder对象来将它们合并成一个视频文件。最后,通过循环读取视频和字幕的帧,并将它们...
在Java编程中,有时我们需要动态地加载外部JAR文件,并执行其中特定的类方法,这在插件系统、模块化应用或动态扩展性需求中尤为常见。本篇将详细讲解如何实现这一目标。 首先,理解JAR(Java Archive)文件是Java...
Java热加载Class文件技术是一种在不重启应用服务器的情况下更新或替换正在运行的Java类的方法,这对于开发者来说是一项非常实用的功能,因为它极大地提高了开发效率。在传统的开发过程中,修改代码后通常需要停止、...
本文将深入探讨"springboot+java类热加载"这一主题,包括其核心概念、实现方式以及相关技术。 **热加载(Hot Loading)**是开发过程中的一个重要功能,它允许开发者在不重启应用的情况下更新代码,提高开发效率。在...
3. **编写加载代码**:使用Loader接口编写Java代码,指定要加载的CAD或3DMAX文件的位置,调用Loader的相应方法将文件转换为Java3D场景数据。 4. **集成场景**:将加载的3D场景数据集成到Java3D的场景图中,设置必要...
2. **Java加载3D模型**: - 在Java中,我们可以使用各种库来解析和加载这些3D模型,如J3D(Java 3D)、JMonkeyEngine或j3mdk等。这些库提供了API,可以读取OBJ和STL文件,并将数据转化为Java对象,以便进一步处理。...
JAVA动态加载JAR文件以及反射调用其方法
Java提供了多种方式来加载properties文件,本文将详细介绍Java加载properties文件的两种主要实现方式,并提供相应的示例代码。 使用java.util.Properties类的load(InputStream in)方法加载properties文件 Java中的...