首先:

  资源文件分两种:后缀.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代码如何读取资源文件的更多相关文章

  1. Java-Servlet--《12-WEB应用中的普通Java程序如何读取资源文件.mp4》 有疑问

    \第五天-servlet开发和ServletConfig与ServletContext对象\12-WEB应用中的普通Java程序如何读取资源文件.mp4; 多层时,DAO为了得到资源文件中的配置参数: ...

  2. WEB应用中的普通Java程序如何读取资源文件

    package cn.itcast; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Serv ...

  3. java代码如何读取properties文件

    我们在开发工程中,有时候需要在Java代码中定义一些在部署生产环境时容易改变的变量,还需要我们单独放在一个外部属性文件中,方便我们将来修改.这里列出了两种比较方便的方式. 一.在Spring配置文件中 ...

  4. Java/JavaWeb中读取资源文件

    1.一般工程中使用I/O类指定文件的绝对路径读取 FileInputStream fis = new FileInputStream("src/main/resources/zsm.prop ...

  5. JSP中嵌入java代码方式以及指令

    JSP中嵌入java代码的三种方式: (1)声明变量或方法 :  <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet):  <% j ...

  6. java 从jar包中读取资源文件

    在代码中读取一些资源文件(比如图片,音乐,文本等等),在集成环境(Eclipse)中运行的时候没有问题.但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码: Jav ...

  7. (转)java 从jar包中读取资源文件

    (转)java 从jar包中读取资源文件 博客分类: java   源自:http://blog.csdn.net/b_h_l/article/details/7767829 在代码中读取一些资源文件 ...

  8. JSP中的Java代码和内置对象

    一.JSP中的Java代码 (一)JSP页面中有三种方式嵌入java代码: 1.java的表达式 格式:<%= java表达式 %> 2.java的语句 格式:<% java语句&g ...

  9. Myeclipse中把java代码导成UML类图

    Myeclipse中把java代码导成UML类图 1.右键点击项目名称,选择New-------àUML2 Model 2.给类图命名 3.导成类图 1)如果要把整个项目导成类图,则把整个项目拖到类图 ...

随机推荐

  1. AWS Aurora数据库 Multi-Master 小测

    AWS Aurora Mysql终于推出了Multi-Master,直面硬刚Oracle RAC.在多一份数据库产品选择的小兴奋之余,我们也看看新推出的Multi-Master的特点(包括优缺点). ...

  2. java学习-NIO(一)简介

    I/O简介 在 Java 编程中,直到最近一直使用 流 的方式完成 I/O.所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节.流 I/O 用于与外部世界接触. ...

  3. redhat linux 5.3安装activeMQ

    安装环境:linux redhat enterprise 5.3 activemq版本:5.9.01.从http://activemq.apache.org/download.html地址下载apac ...

  4. 【CodeForces - 1200C】Round Corridor (数论gcd)

    Round Corridor  Descriptions Amugae位于一个非常大的圆形走廊中.走廊由两个区域组成.内部区域等于nñ扇区,外部区域等于m米部门.在相同区域(内部或外部)的每对扇区之间 ...

  5. MySQL-EXPLAIN执行计划字段解释

    做 MySQL 查询优化遇到明明建了索引查询仍然很慢,看这个 SQL 的执行计划,看它到底有没有用到索引,执行的具体情况.我们可以用 EXPLAIN 命令查看 SQL 的执行计划,SQL 优化的重要性 ...

  6. django的安装及基本设置记录

    环境变量的配置在这个文章中,不会的可以去看看 https://www.cnblogs.com/alex3174/p/11116558.html 主要步骤是:我的电脑-右键-属性-高级系统设置-环境变量 ...

  7. pythonday03数据类型(一)

    今日内容 1.整型 2.布尔型 3.字符串 4.补充 5.作业讲解 6,pycharm自动生成头文件 1.整型(int) py2 int/long 32位电脑:-2147483648-21474836 ...

  8. 01-WIN2012R2+SQL2016故障转移群集的搭建

    一.前期准备  1.1.准备4台机器 机器名 IP 功能 jf-yukong 192.168.10.200 做域控服务器 Jf-storage 192.168.10.201 做ISCSI存储服务器 J ...

  9. cs231n---卷积网络可视化,deepdream和风格迁移

    本课介绍了近年来人们对理解卷积网络这个“黑盒子”所做的一些可视化工作,以及deepdream和风格迁移. 1 卷积网络可视化 1.1 可视化第一层的滤波器 我们把卷积网络的第一层滤波器权重进行可视化( ...

  10. .net软件开发脚本规范-JS标准

    一. JS标准 新增页面表单检查方法名称固定为checkForm. 查询页面表单检查方法名称固定为checkSearchForm. 检查表单方法checkForm与checkSearchForm固定放 ...