生成任意内容任意类型的文件

任何类型都可以,内容也是,excel虽然也可以生成,但它会把所有内容都放到第一个,所以还是老实用一般方法吧。

 

这个有点麻烦,我们一步步来(可以先拉到最后看一眼配置文件会比较好理解)

第一个类:调用方法

public void test(){
  //参数一是需要放进去的内容,具体肯定不会这么短(根据模板多个的情况下改用list)
  //参数二是读取配置文件的路径
  insertContent("111", "D:/dev/workspace/lzpt/resource/");
}

 

第二个类:基础方法类

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import com.flatform.cfg.domain.BasicCfgMessage;

public class CodeGenerator {

  public static String flag = "0";
  private String classPackage;
  private String codePath;
  private String sourcePath;
  private BasicCfgMessage message;
  //各种路径
  public void config(String classPackage, String codePath) {
    this.classPackage = classPackage;
    this.codePath = codePath;
    //这里影响生成的文件被放在哪里
    this.sourcePath = (codePath + "/content/");
  }
  //上面调用的就是这个方法
  public static void insertContent(String content, String path) throws SQLException {
    CodeGenerator dg = new CodeGenerator();
    //你的路径配置文件的路径(如果放在resource(根目录)下面的话,直接写名字)
    String propertFilePath = "template.config.properties";
    String classPackage = StringUtil.getPropertyFromFile(path, propertFilePath, "classPackage");
    String codePath = StringUtil.getPropertyFromFile(path, propertFilePath, "codePath");
    dg.config(classPackage, codePath);
    return dg.generator(content, path);
  }

  public void generator(String content, String path) {
    Map<String, Object> map = new HashMap<String, Object>();// 实例化一个map
    //根据配置文件的参数可能有多个,这里只有一个content,因为只配了content
    map.put("content", content);
    //取名字,随便取吧
    String name = UUIDUtils.create();

  try {
    //第一个参数是内容配置文件,可以配置多个,多个的话,这段代码复制粘贴几遍就行了
    //第四个参数(就是那个有.exe的,是文件类型,什么后缀出来的就是什么类型的文件。exe当然也可以生成,虽然根据内容可能无法运行(还是txt,doc这种观赏类的比较适用)……)
    VelocityInfoOp.generatorCode("template.vm", map, this.sourcePath, name + ".exe", path);
    //没什么意义,看一眼信息用的
    System.out.println("***************代码生成完成******************");
    System.out.println("代码路径:" + this.codePath);
    System.out.println("包:" + this.classPackage);
    System.out.println("********************************************");
  } catch (Exception e) {
    throw new RuntimeException();
  }

  }

  public String getClassPackage() {
    return this.classPackage;
  }

  public void setClassPackage(String classPackage) {
    this.classPackage = classPackage;
  }
  public String getPath() {
    return this.sourcePath;
  }

  public void setPath(String path) {
    this.sourcePath = path;
  }
}

 

下一个类:配路径用的

public static synchronized String getPropertyFromFile(String path, String filename, String key) {
  // getProperty获取指定键指示的系统属性
  //获取路径配置文件时的路径,具体情况具体分析
  String paodingAnalysisPath = path + filename;
  // 定义一个输入流
  InputStream in1 = null;
  // 定义一个类,资源包包含特定于语言环境的对象(需要特定语言环境的的资源时,加载资源包内的信息)
  ResourceBundle rb = null;
  try {
    in1 = new BufferedInputStream(new FileInputStream(paodingAnalysisPath));

    rb = new PropertyResourceBundle(in1);
  } catch (Exception e) {
    e.printStackTrace();
  }

  return rb.getString(key).trim();// 去掉空格,返回内容
}

 

最后一个类:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.Map;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;

public class VelocityInfoOp {
  public static void generatorCode(String templateFile, Map<String,Object> contextMap, String path, String fileName,String vmpath){
   VelocityContext context = new VelocityContext();

   VelocityEngine ve = new VelocityEngine();
   //获取内容配置文件的路径,同样具体情况具体分析
   String vPath = vmpath +"template";
   System.out.println(vPath);

   ve.setProperty("file.resource.loader.path", vPath);

   ve.setProperty("input.encoding", "UTF-8");

   ve.setProperty("output.encoding", "UTF-8");

   ve.init();

   for (Iterator<String> i$ = contextMap.keySet().iterator(); i$.hasNext();) {
   String key = i$.next();      context.put(key, contextMap.get(key));    }    Template template = null;    try    {      template = ve.getTemplate(templateFile);    }catch (Exception e){      e.printStackTrace();    }    StringWriter sw = new StringWriter();    if (template != null) {      template.merge(context, sw);    }    File pathTemp = new File(path);    if (!pathTemp.exists())    {      pathTemp.mkdirs();    }    writeFile(pathTemp + "/" + fileName, sw.toString());  }  public static void writeFile(String filePathAndName, String fileContent)  {    try    {      File f = new File(filePathAndName);      if (!f.exists()) {        f.createNewFile();      }      OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(f), "UTF-8");      BufferedWriter writer = new BufferedWriter(write);      writer.write(fileContent);      writer.close();    } catch (Exception e) {      System.out.println("写文件内容操作出错");      e.printStackTrace();    }  } }

 

最后放一下配置文件里面的内容

template.config.properties里面:

author=SOMEONE
classPackage=com.test
codePath=/dev/workspace/test/src

就是些路径,方便改,你也可以直接写在类里面

 

template.vm里面:

${content}

这里说明一下

如果配的是:

内容为:${content}

前面map里面,content的内容为111

文件内容最终会是“内容为:111”

参数可以是多个,几个参数map就放几个值,键名与参数名一致就行

 

以上。

原文地址:https://www.cnblogs.com/IceBlueBrother/p/8423105.html