`
444878909
  • 浏览: 641557 次
文章分类
社区版块
存档分类
最新评论

IO流之MemoryOutputStream

 
阅读更多

先简单的描述一下需求。再用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,并没有一个完整的框架。




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics