DownProtocolDataService.java 2.12 KB
package com.bsth.service;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.bsth.util.AppProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Hill
 */
public class DownProtocolDataService {
	
	private final static Logger log = LoggerFactory.getLogger(DownProtocolDataService.class);
	
	private static DownProtocolDataService service = new DownProtocolDataService();

	private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");

	private String dir = AppProperties.getDowndir();

	private Date cur = new Date();
	/**
	 * 下次切换写文件时间节点
	 */
	private long nextTime;

	private BufferedOutputStream out;

	private String fileName;

	private DownProtocolDataService() {
		File file = new File(dir);
		Date now = new Date();
		if (!file.exists()) { file.mkdirs(); }
		fileName = sdf.format(now);
		nextTime = now.getTime() + 3600000 - now.getTime() % 3600000;
		try {
			out = new BufferedOutputStream(new FileOutputStream(dir + fileName, true));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			log.error(dir + fileName + "文件未找到");
		}
	}
	
	public static DownProtocolDataService getInstance() {
		return service;
	}
	
	public void write(byte[] bytes) throws IOException {
		long now = System.currentTimeMillis();
		if (nextTime < now) {
			cur.setTime(now);
			rollOver(now);
		}
		out.write(bytes);
		out.flush();
	}
	
	private synchronized void rollOver(long now) throws IOException {
		if (now < nextTime) {
			return;
		}
		BufferedOutputStream os = out;
		try {
			fileName = sdf.format(cur);
			File file = new File(dir + fileName);
			out = new BufferedOutputStream(new FileOutputStream(file, true));
			nextTime = getNextTime(now);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			log.error(dir + fileName + "文件未找到");
		} finally {
			os.flush();
			os.close();
		}
	}
	
	private long getNextTime(long now) {
		return now + 3600000 - now % 3600000;
	}
}