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

任何类型都可以,内容也是,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

时间: 2024-10-13 09:50:30

生成任意内容任意类型的文件的相关文章

ThinkCMF框架任意内容包含漏洞分析复现(写入shell+文件包哈)

ThinkCMF框架任意内容包含漏洞分析复现 0x00 简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建.ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展.每个应用都能独立的完成自己的任务,也可通过系统调用其他应用进行协同工作.在这种运行机制下,开发商场应用的用户无需关心开发SNS应用时如何工作的,但他们之间又可通过系统本身进行协调,大大的降低了开发成本和沟通成本. 0x

ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)

1.漏洞概述 攻击者可利用此漏洞构造恶意的url,向服务器写入任意内容的文件,达到远程代码执行的目的 2.影响版本 ThinkCMF X1.6.0 ThinkCMF X2.1.0 ThinkCMF X2.2.0 ThinkCMF X2.2.1(我用的是这个) ThinkCMF X2.2.2 ThinkCMF X2.2.3 3.安装 赋予权限 4.安装系统 安装成功进入主页 Poc /?a=display&templateFile=README.md /?a=fetch&templateFi

自定义类加载器——加载任意指定目录的class文件

public class MyClassLoader extends ClassLoader{ String path;//自定义类加载器所负责的文件夹 public MyClassLoader(String path) { super(); this.path = path; } @SuppressWarnings("deprecation") @Override protected Class<?> findClass(String name) throws Class

ThinkCMF框架任意内容包含

更多内容,欢迎关注微信公众号:信Yang安全,期待与您相遇. ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建.ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展.每个应用都能独立的完成自己的任务,也可通过系统调用其他应用进行协同工作.在这种运行机制下,开发商场应用的用户无需关心开发SNS应用如何工作的,但他们之间又可通过系统本身进行协调,大大的降低了开发成本和沟通成本.影响版本

MFC 修改默认生成文件和默认生成工程内容

修改默认生成文件和默认生成工程的内容是非常非常实用的!因为这样我们就不用每次新建一个工程都去做以前做过的一些工作,譬如用到OpenCV就要去包含它的头文件等等,当然在.h文件中默认直接加上作者.公司的描述也会显得更方便,方法如下: 首先是修改.h和.cpp文件的默认生成内容(即添加新建项时文件将会自带你添加的内容,而不是空白一片),这个问题关键在于找到其模板文件路径,本人的路径是"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcp

使用 inline-block 水平垂直居中任意内容

挺好用的水平垂直居中任意内容代码,并且支持度很高 html <!-- 注释用于去除 inline-block `间隙` --> <div class="container"><!-- --><div class="center"> <h2>这个是居中标题</h2> <p>这里是一些文字,文字</p> </div><!-- --></div&g

将一个文件中的内容,在另一个文件中生成. for line in f1, \n f2.write(line)

将一个文件中的内容,在另一个文件中生成. 核心语句: for line in f1: f1中的所有一行 f2.write(line)                                  # 是直接写入f1中出来的每一行,用   .write() 原文地址:https://www.cnblogs.com/jack20181017/p/9863521.html

Delphi如何处理不同类型的文件

参考:http://www.cnblogs.com/railgunman/articles/1800318.html 程序设计当中,我们时常遇到需要处理文件.目录及驱动器的情况,这里将对如何处理不同类型的文件进行讲述 主要包括如何使用 TFileStream 类封装文件的输入/输出以及如何利用 32 位windows的主要特征——内存映射文件.将会学到如何创建一个封装内存映射文件功能的 TMemoryMappedFile类,并用它在文本文件中进行文本查询.还提供了一些关于选择驱动器.在树形目录中

子界类型、集合类型、记录类型、文件类型

子界类型 如果我们定义一个变量i为integer类型,那么i的值在微型机系统的pascal中,使用2字节的定义表示法,取值范围为-32768-32767.而事实上,每个程序中所用的变量的值都有一个确定的范围. 例如,人的年龄一般不超过150,一个班级的学生不超过100人,一年中的月数不超过12,一月中的天数不超过31,等等. 如果我们能在程序中对所用的变量的值域作具体规定的话,就便于检查出那些不合法的数据,这就能更好地保证程序运行的正确性.而且在一定程度上还会节省内存空间. 子界类型就很好解决如