【Java】【Velocity】JARファイル内のリソースファイルを開いてApache Velocityを使って文字列取得

■ はじめに

https://blogs.yahoo.co.jp/dk521123/37497699.html
で、JARファイル内のリソースファイルのパスは
「jar:file:/C:/XXXX/SampleDemo-1.0.0.jar!/Sample.vm」のようになる。
しかし、直接ストリームとしてオープンすることは可能なので
そのサンプルを書く

■ Tips

リソースファイルからInputStreamを取得するには

InputStream inputStream =
  【自クラス】.class.getClass().getResourceAsStream("【リソースファイル】");

Velocityで文字列をテンプレートとして使うには

Velocity.init();
VelocityContext context = new VelocityContext();
context.put("【キー】", "【値】");

try (StringWriter stringWriter = new StringWriter();) {
    Velocity.evaluate(context, stringWriter, "【任意文字列】", 【★テンプレート文字列】);
    System.out.println("Result : " + stringWriter.toString());
}

■ サンプル

JarOpenDemo.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

public class JarOpenDemo {
  public static void main(String[] args) {
    try (InputStream inputStream = JarOpenDemo.class.getClass()
        .getResourceAsStream("/mail/templates/sample.vm");) {
      String fileText = toString(inputStream);
      System.out.println("File Content : " + fileText);

      // Using Velocity
      Velocity.init();
      VelocityContext context = new VelocityContext();
      context.put("name", "Mike");
      try (StringWriter stringWriter = new StringWriter();) {
        Velocity.evaluate(context, stringWriter, "Demo", fileText);
        System.out.println("Result : " + stringWriter.toString());
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  public static String toString(InputStream inputStream) throws IOException {
    if (inputStream == null) {
      return null;
    }

    try (BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(inputStream));) {
      StringBuilder stringBuilder = new StringBuilder();

      String line;
      while ((line = bufferedReader.readLine()) != null) {
        stringBuilder.append(line);
      }
      return stringBuilder.toString();
    }
  }
}

/mail/templates/sample.vm

Hello World, $name

出力結果

File Content : Hello World, $name
Result : Hello World, Mike


関連記事

Java での リソース の扱いについて

https://blogs.yahoo.co.jp/dk521123/37497699.html

Apache Velocity ~入門編~

https://blogs.yahoo.co.jp/dk521123/34456704.html