zoukankan      html  css  js  c++  java
  • 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:

     1 //由servletDemo11调用
     2 public class UserDao {
     3 
     4 public void update() throws IOException{
     5 //getClassLoader():加载类加载器 之后返回一个类加载器
     6 InputStream in = UserDao.class.getClassLoader().getResourceAsStream("1.properties");
     7 Properties p = new Properties();
     8 p.load(in);
     9 String url = p.getProperty("url");
    10 System.out.println(url);
    11 }

    在实际开发中:有增删改查一系列操作,加上资源文件只读取一次,所以需要把读取资源文件的代码抽出来放到静态代码块中去

        代码如下:

         被调用的Java程序中的代码2: 

     1 //由servletDemo11调用
     2 public class UserDao {
     3     private static Properties p = new Properties();
     4     static{
     5         //此时1.properties在src下
     6         InputStream in = UserDao.class.getClassLoader().getResourceAsStream("WEB-INF/classes/1.properties");
     7         try {
     8             p.load(in);
     9         } catch (IOException e) {
    10             //因为现在是要连接数据库,连接过程出现了异常就连接不上,所以直接抛出来一个错误Error
    11             throw new ExceptionInInitializerError();
    12         }
    13         
    14     }
    15     
    16     public void update() throws IOException{
    17         System.out.println(p.getProperty("url"));
    18     }    
    19 }

    需要注意:

      通过类加载器加载资源文件时,资源文件不能过大。在装载大的资源文件时,类加载器和平时加载类一样把文件夹到内存中去,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,才可以进行下一步操作,访问资源还是修改访问后的资源,都不影响

    此时问题就解决了。

  • 相关阅读:
    ueditor1.4.3.all.js报错
    ueditor中FileUtils.getTempDirectory()找不到
    java后台验证码的生成
    applicationContext.xml重要配置
    Java代码实现文件上传(转载)
    jquery动态实现填充下拉框
    POI写入word docx 07 的两种方法
    POI读word docx 07 文件的两种方法
    POI转换word doc文件为(html,xml,txt)
    Linux中zip压缩和unzip解压缩命令详解
  • 原文地址:https://www.cnblogs.com/rgever/p/7911420.html
Copyright © 2011-2022 走看看