先简单的描述一下需求。再用Freemarker的时候需要根据模板文件来生成目标对象,Freemarker可以把生成的目标对象回写到文件中,这种方式并不是我想要的。我需要直接拿到对象进行传输。
看看常规Freemarker的处理方式:
下面的图是代表我要的方式,重点是最后一步:
Freemarker是以管道流的方式进行对数据读出/写入的操作。看了目前的IO流,并没有发现一个对象可以支持直接写入到内存的流,可能是我没有发现。所以我自己写一个,实现的比较简单。先上代码:
public class MemoryOutputStream extends OutputStream{
private List<Byte> byteList = new ArrayList<Byte>();
/* (non-Javadoc)
* @see java.io.OutputStream#write(int)
*/
@Override
public void write(int b) throws IOException {
byteList.add((byte)b);
}
public String toString(){
if(CollectionsUtil.isNotEmpty(byteList)){
byte[] bytes = new byte[byteList.size()];
for(int i=0;i<byteList.size();i++){
bytes[i]=byteList.get(i);
}
try {
return new String(bytes,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return null;
}
}
代码实现的非常简单,就是用一个String存储数据,由于数据流的操作都是以字节的方式,所以需要把整个字节收集到然后作一个转换。这里用了List进行存储是为了省事,完全不考虑性能方面。
有了这个流我就可以拿到回写的数据了,而不需要再去读文件。看看具体的使用场景:
//这里为了代码的简洁,删除了一些代码,重点MemoryOutputStream作为接收流的使用方式
public String cache(Map<String,Object> root,String ftl){
MemoryOutputStream mos = new MemoryOutputStream();
//ftl为模板
Template t = this.getTemplate(ftl);
out = new OutputStreamWriter(mos, "UTF-8");
//root为传进来的数据对象
t.process(root, out);
return mos.toString();
}
整个代码和使用场景就完了,后续还是需要把整个IO流作一个梳理。目前基本上是需要用哪个然后去查
API,并没有一个完整的框架。
分享到:
相关推荐
2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、...
IO流 javaio java 流
JAVAIO流总结宝典,分享给大家,总结较为全面
想了解IO输入输出流的学者可以看看,里面有详细的讲解及源代码。
java基础之IO流,基础简介知识,帮助你了解java的io技术
思维导图io流思维导图io流思维导图io流思维导图io流思维导图io流思维导图io流
本人是初学者,在老师的指导下,将自身对Java中IO流的理解做成以下思维导图
map集合的特性和它的遍历方式 还有一个根据Set特性的一个排序 以及IO流 字节流和字符流实现代码
关于java的IO流基础的练习,适合刚接触IO流,没有基础的同学
IO流文件的复制
java之io流实例应用。
彻底明白Java的IO流
IO流的主要流
适用于刚学习过Java,尚未学习数据库的人,因为本程序要存储学生以及老师账户,需要用到IO流写的操作
IO流读取和创建文件IO流读取和创建文件IO流读取和创建文件IO流读取和创建文件IO流读取和创建文件
IO流..
它们的一些用法,作用
Java中文件IO流.pdf 学习资料 复习资料 教学资源
这是一份关于android开发的相关资料,供初学者学习使用。
javaIO流javaIO流