apache Velocity模版引擎--资源加载方式

1. java加载资源的方式

1.1 通过java i/o提供的接口以普通文件的形式加载

1.2 通过Class 类加载资源

public InputStream getResourceAsStream(String name);

如果使用Class类来加载资源文件需要区分以 '/' 开头和不以 '/'开头。

  • 以 '/'开头:Java以classpath为根目录,直接加上name来搜索资源文件。
  • 不以 '/'开头:资源文件的全路径应该为:调用getResourceAsStream方法的类的package路径加上name。
    /**
     * Add a package name prefix if the name is not absolute Remove leading "/"
     * if name is absolute
     */
    private String resolveName(String name) {
        if (name == null) {
            return name;
        }
        //不以 ‘/’开头处理路径,移除/,包名中.换成/
        /**
         * 比如:com.velocity   -->  com/velocity
        **/
        if (!name.startsWith("/")) {
            Class c = this;
            while (c.isArray()) {
                c = c.getComponentType();
            }
            String baseName = c.getName();
            int index = baseName.lastIndexOf('.');
            if (index != -1) {
                name = baseName.substring(0, index).replace('.', '/')
                    +"/"+name;
            }
        } else {
            //以 / 开头紧紧简单移除 /
            name = name.substring(1);
        }
        return name;
    }

1.3 通过ClassLoader 加载资源

public InputStream getResourceAsStream(String name);

用ClassLoader加载配置文件时,name均不能以"/"开头,在查找时直接在classpath下进行查找。

1.4 java加载资源的demo

1.4.1 项目结构

apache Velocity模版引擎--资源加载方式_第1张图片
目录结构

1.4.2 conf.properties

pro=pro

1.4.2 main函数

package com.velocity.resources;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @author mingxin
 */
public class ResourcesLoad {

  public static void main(String[] args){
    ResourcesLoad main = new ResourcesLoad();
    try{
      main.loadByClassLoader();
    }catch (IOException e){
      e.printStackTrace();
    }
  }

  public void loadByClass() throws IOException{
    InputStream input = this.getClass().getResourceAsStream("/conf.properties");
    Properties properties = new Properties();
    properties.load(input);
    System.out.println(properties);
  }

  public void loadByClassLoader() throws IOException{
    InputStream input = this.getClass().getClassLoader().getResourceAsStream("conf.properties");
    Properties properties = new Properties();
    properties.load(input);
    System.out.println(properties);
  }
}

2. velocity加载配置文件的方式

2.1 Velocity.init( String propsFilename )

找到 Velocity.init源码

    /**
     *  initialize the Velocity runtime engine, using default properties
     *  plus the properties in the properties file passed in as the arg
     *
     *  @param propsFilename file containing properties to use to initialize
     *         the Velocity runtime
     */
    public static void init( String propsFilename )
    {
        RuntimeSingleton.init(propsFilename);
    }

一路找下去最终可以到ExtendedProperties,可以看到文件的加载是使用new File()来的,这样我们必须给的是绝对路径,所以init一般使用不带参数版本或者Properties作为参数的。

    /**
     * Creates and loads the extended properties from the specified file.
     *
     * @param file  the filename to load
     * @param defaultFile  a second filename to load default values from
     * @throws IOException if a file error occurs
     */
    public ExtendedProperties(String file, String defaultFile) throws IOException {
        this.file = file;

        basePath = new File(file).getAbsolutePath();
        basePath = basePath.substring(0, basePath.lastIndexOf(fileSeparator) + 1);

        FileInputStream in = null;
        try {
            in = new FileInputStream(file);
            this.load(in);
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {}
        }

        if (defaultFile != null) {
            defaults = new ExtendedProperties(defaultFile);
        }
    }

你可能感兴趣的:(apache Velocity模版引擎--资源加载方式)