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,並沒有一個完整的框架。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章