WEB应用中普通java代码如何读取资源文件
首先:
资源文件分两种:后缀.xml文件和.properties文件
.xml文件:当数据之间有联系时用.xml
.properties文件:当数据之间没有联系时用.properties
正题:
java代码读取资源文件
一般我们所写的java代码是在src的包下,因为src包下的文件、类等最终都会发布到WEB-INF/classes目录下去,这些类要能够被服务器调用,首先要被类装载器装载,同样的类装载器也可以装载资源文件。
下列举例是读取连接数据库的资源文件:
代码:
servlet中的代码:
public class servletDemo11 extends HttpServlet {
//servlet调用其他程序,在其他程序中如何读取资源文件
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UserDao dao = new UserDao();
dao.update();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
被调用的Java程序中的代码1:
//由servletDemo11调用
public class UserDao { public void update() throws IOException{
//getClassLoader():加载类加载器 之后返回一个类加载器
InputStream in = UserDao.class.getClassLoader().getResourceAsStream("1.properties");
Properties p = new Properties();
p.load(in);
String url = p.getProperty("url");
System.out.println(url);
}
在实际开发中:有增删改查一系列操作,加上资源文件只读取一次,所以需要把读取资源文件的代码抽出来放到静态代码块中去
代码如下:
被调用的Java程序中的代码2:
//由servletDemo11调用
public class UserDao {
private static Properties p = new Properties();
static{
//此时1.properties在src下
InputStream in = UserDao.class.getClassLoader().getResourceAsStream("WEB-INF/classes/1.properties");
try {
p.load(in);
} catch (IOException e) {
//因为现在是要连接数据库,连接过程出现了异常就连接不上,所以直接抛出来一个错误Error
throw new ExceptionInInitializerError();
} } public void update() throws IOException{
System.out.println(p.getProperty("url"));
}
}
需要注意:
通过类加载器加载资源文件时,资源文件不能过大。在装载大的资源文件时,类加载器和平时加载类一样把文件夹到内存中去,java虚拟机很可能会因为内存溢出而崩溃。
这里还有一个实际开发中会遇到的问题:
当在服务器运行过程中把资源文件进行改动后,再次进行访问,访问的数据会不会变?
答案是不会。
原因是:类加载器只加载一次,内存中已经装载过了,所以不会变。
现在要想访问改动后的资源文件,解决办法有两个:
1、重新启动服务器,再次访问,但这不符合实际开发的设计思想,仅供个人实践;
2、用传统方式去读(因为类加载器只能加载一次,所以通过类加载器是访问不了的,但又因为传统方式需要文件的路径,所以可以通过类加载器获取文件路径,之后通过传统方式去读)
传统方式代码如下:
1 public void update() throws IOException{
2
3 //getResource():查找具有给定名称的资源。并返回它的URL地址
4 //getPath():获取此 URL 的路径部分。
5 String str = UserDao.class.getClassLoader().getResource("/WEB-INF/classes/1.properties").getPath();
6 //传统方式读,传统方式里需要文件的路径为:相对于Java虚拟机的路径
7 FileInputStream in = new FileInputStream(str);
8 Properties p = new Properties();
9 p.load(in);
10 String url = p.getProperty("url");
11 System.out.println(url);
12 }
此时,请注意我的上一段代码,getResource方法里面的地址写的是"/WEB-INF/classes/1.properties",声明一下,我的1.properties是在src下,此时会出现一个问题,当你访问servletDemo11时可能会出现抛空指针异常的情况.。
因为存web应用的位置和eclipse文件的位置冲突了,比如我的eclipse在D盘下,tomact的webapps在C盘下,此时要保证C盘下的WEB-INF/classes和D盘下的src下都要有1.properties,才可以进行下一步操作,访问资源还是修改访问后的资源,都不影响


此时问题就解决了。
WEB应用中普通java代码如何读取资源文件的更多相关文章
- Java-Servlet--《12-WEB应用中的普通Java程序如何读取资源文件.mp4》 有疑问
\第五天-servlet开发和ServletConfig与ServletContext对象\12-WEB应用中的普通Java程序如何读取资源文件.mp4; 多层时,DAO为了得到资源文件中的配置参数: ...
- WEB应用中的普通Java程序如何读取资源文件
package cn.itcast; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Serv ...
- java代码如何读取properties文件
我们在开发工程中,有时候需要在Java代码中定义一些在部署生产环境时容易改变的变量,还需要我们单独放在一个外部属性文件中,方便我们将来修改.这里列出了两种比较方便的方式. 一.在Spring配置文件中 ...
- Java/JavaWeb中读取资源文件
1.一般工程中使用I/O类指定文件的绝对路径读取 FileInputStream fis = new FileInputStream("src/main/resources/zsm.prop ...
- JSP中嵌入java代码方式以及指令
JSP中嵌入java代码的三种方式: (1)声明变量或方法 : <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet): <% j ...
- java 从jar包中读取资源文件
在代码中读取一些资源文件(比如图片,音乐,文本等等),在集成环境(Eclipse)中运行的时候没有问题.但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码: Jav ...
- (转)java 从jar包中读取资源文件
(转)java 从jar包中读取资源文件 博客分类: java 源自:http://blog.csdn.net/b_h_l/article/details/7767829 在代码中读取一些资源文件 ...
- JSP中的Java代码和内置对象
一.JSP中的Java代码 (一)JSP页面中有三种方式嵌入java代码: 1.java的表达式 格式:<%= java表达式 %> 2.java的语句 格式:<% java语句&g ...
- Myeclipse中把java代码导成UML类图
Myeclipse中把java代码导成UML类图 1.右键点击项目名称,选择New-------àUML2 Model 2.给类图命名 3.导成类图 1)如果要把整个项目导成类图,则把整个项目拖到类图 ...
随机推荐
- 【游记】NOIP2018初赛
声明 本文最初的版本创建之时,本人甚至只是个电脑的小白,因而不太会用电脑编辑文字,最初的版本写在一个Word文档里,被随意的丢弃在我杂乱无比的网盘的某一个角落,直到我决定整理自己的成长历程,将散落的游 ...
- Selenium+java - 截图操作
写在前面 自动化测试过程中,运行失败截图可以很好的帮我们定位问题,因此,截图操作也是我们自动化测试中的一个重要环节. 截图方法 1.通过截图类TakeScreenshout实现截图 特点:截取浏览器窗 ...
- 跟着大彬读源码 - Redis 10 - 对象编码之整数集合
[TOC] 整数集合是 Redis 集合键的底层实现之一.当一个集合只包含整数值元素,并且元素数量不多时,Redis 就会使用整数集合作为集合键的底层实现. 1 整数集合的实现 整数集合是 Redis ...
- 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫
前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,本文记录免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作 ...
- 大数据学习之旅1——HDFS版本演化
最近开始学习大数据,发现大数据有很多很多组件,我现在负责的是HDFS(Hadoop分布式储存系统)的学习,整理了一下HDFS的版本情况.因为HDFS是Hadoop的重要组成部分,所以有关HDFS的版本 ...
- Python模块之netmiko
一.简介 此模块用于简化paramiko与网络设备之间的ssh连接,可在windows与Unix平台使用 二.目前支持的设备 (2019.03.07) Regularly tested Arista ...
- 整合-flowable-modeler,第一篇
BPMN流程想必大家都不陌生,经过这十几年的不断发展完善,在处理业务流程操作已经相当完善,我这里先不进行流程引擎的具体描述,单对集成流程设计器这块进行笔记,如有不对,跪求指出.
- Redis的常用命令与Java整合及高级应用篇
一,redis是什么? 首先数据库分为关系型数据库和非关系型数据库,关系型数据库是采用关系模型来组织数据的数据库,简单来说就是二维表格模型,同时保证事务的一致性. 相反非关系型数据库采用key ...
- HBase 系列(四)—— HBase 集群环境配置
一.集群规划 这里搭建一个 3 节点的 HBase 集群,其中三台主机上均为 Regin Server.同时为了保证高可用,除了在 hadoop001 上部署主 Master 服务外,还在 hadoo ...
- [Flowable] - 工作流是什么?BPM是什么?
工作流管理系统基本概念 近两年随着电子商务环境不断演进(例如阿里巴巴的B2B电子商务平台),从原来支持企业内部单系统的业务流程.到企业内部应用.服务的集成,再进一步向企业与合作伙伴之间业务交互,工作流 ...