Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1798766
  • 博文数量: 600
  • 博客积分: 10581
  • 博客等级: 上将
  • 技术积分: 6205
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-06 10:13
文章分类
文章存档

2016年(2)

2015年(9)

2014年(8)

2013年(5)

2012年(8)

2011年(36)

2010年(34)

2009年(451)

2008年(47)

分类: Java

2009-04-02 16:49:36

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class NfsFileTest {
 /**
  * 下划线分隔符
  */
 private static final char UNDERLINE = '_';
 /**
  * 文件后缀
  */
 private static final String POSTFIX = ".dat";
 /**
  * 记录中XML的标签尾
  */
 private static final String ADTN_XML_TAIL = "\r\n";
 /**
  * 同时写入的文件数
  */
 private static final int OUT_FILE_COUNT = 10;
 /**
  * 记录中XML的标签头
  */
 private static final String ADTN_XML_HEAD = "";
 /**
  * NFS文件的根路径,剩余部分每个产品自行拼接
  */
 private static final String NFS_PATH_ROOT = "/tmp";
 /**
  * NFS文件数组
  */
 private static File[] adtnFile = new File[OUT_FILE_COUNT];
 /**
  * NFS输出流数组
  */
 private static FileOutputStream[] adtnOut = new FileOutputStream[OUT_FILE_COUNT];
 /**
  * 每个文件写的次数
  */
 private static long[] adtnWriteCount = new long[OUT_FILE_COUNT];
 private static Object[] lock = new Object[OUT_FILE_COUNT];
 static {
  for (int i = 0; i < lock.length; i++) {
   lock[i] = new Object();
  }
 }
 /**
  * 每写多少次检查一次文件的大小
  */
 private static final int CHECK_INTERVAL = 500;
 // private static final int CHECK_INTERVAL = 10;
 /**
  * 文件大小的上限
  */
 // private static final long FILE_SIZE_LIMIT = 104857600;//100M
 // private static final long FILE_SIZE_LIMIT = 3096;//100M
 // private static final long FILE_SIZE_LIMIT = 52428800;//50M
 private static final long FILE_SIZE_LIMIT = 8388608;// 8M
 // private static final long FILE_SIZE_LIMIT = 102400;//Test100K
 
 public static String generateTetradHexRandomString() {
  StringBuffer name = new StringBuffer();
  for (int i = 0; i < 4; i++) {
   name.append(Integer.toHexString(new Random().nextInt(16)));
  }
  return name.toString();
 }
 public static int getRandom(int upLimit) {
  Random random = new Random();
  return random.nextInt(upLimit);
 }
 public static String getCurrentDateString(String format) {
  Date date = new Date();
  SimpleDateFormat sf = new SimpleDateFormat(format);
  return sf.format(date);
 }
 public static String writeNFSFile(String businessID, String filePath,
   String uid, String imei, byte[] data) throws IOException {
  // 得到当前日期 yyyyMMdd
  String currentDate =  getCurrentDateString("yyyyMMdd");
  // 得到随机的文件编号
  int fileIndex = getRandom(OUT_FILE_COUNT);
  // 获取文件名
  StringBuffer sbFileName = new StringBuffer();
  sbFileName.append(filePath).append(File.separatorChar).append(
    businessID).append(UNDERLINE).append(currentDate).append(
    UNDERLINE).append(fileIndex).append(POSTFIX);
  String fileName = sbFileName.toString();
  // 得到文件
  File currentFile = new File(fileName);
  synchronized (lock[fileIndex]) {
   // 如果文件不存在
   if (!currentFile.exists()) {
    // 新建此文件
    currentFile.createNewFile();
    // 将此文件放到文件数组中
    adtnFile[fileIndex] = currentFile;
    // 将此写此文件的次数重置为0
    adtnWriteCount[fileIndex] = 0;
    // 如果此下标的输出流不为null,则关闭此输出流。
    if (adtnOut[fileIndex] != null) {
     adtnOut[fileIndex].close();
    }
    // 新建输出流添加到输出流数组中
    adtnOut[fileIndex] = new FileOutputStream(currentFile, true);
   }
   // 如果文件存在
   else {
    // 检查文件对象是否存在,如果不存在,新建
    if (adtnFile[fileIndex] == null) {
     adtnFile[fileIndex] = currentFile;
    }
    // 检查输出流是否可用,如果不可用,新建
    if (adtnOut[fileIndex] == null) {
     adtnOut[fileIndex] = new FileOutputStream(currentFile, true);
    }
   }
   // 写文件
   try {
    String xmlHead = String.format(ADTN_XML_HEAD, uid, imei,
       getCurrentDateString("yyyyMMdd HHmmss"));
    adtnOut[fileIndex].write(xmlHead.getBytes());
    adtnOut[fileIndex].write(data);
    adtnOut[fileIndex].write(ADTN_XML_TAIL.getBytes());
    adtnOut[fileIndex].flush();
   } catch (IOException ioe) {
    ioe.printStackTrace();
    throw ioe;
   }
   // 写此文件的次数加1
   adtnWriteCount[fileIndex]++;
   System.out.println(fileIndex+"Write Count="+adtnWriteCount[fileIndex]);
   // 如果需要检查文件的大小
   if (adtnWriteCount[fileIndex] % CHECK_INTERVAL == 0) {
    // 检查文件的大小,如果文件大小超过上限,将现在的文件改名
    if (adtnFile[fileIndex].length() >= FILE_SIZE_LIMIT) {
     // 文件改名
     adtnOut[fileIndex].close();
     adtnOut[fileIndex] = null;
     File newFile = new File(fileName + UNDERLINE
       + generateTetradHexRandomString()
       + UNDERLINE + "."
       +  getCurrentDateString("HH_mm_ss"));
     boolean rename = adtnFile[fileIndex].renameTo(newFile);
     System.out.println(rename);
    }
   }
  }
  return currentFile.getAbsolutePath();
 }
 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  String date = "ddddddddddddddddddddddddddddddddddddd";
  int i = 0 ;
  while (i<200000)
  {
   i++;
   String retFilePath = writeNFSFile("108", "e:\\logs\\20090401",
     "11111111111", "22222222222", date.getBytes());
   //System.out.println(retFilePath);
  }
 }
}
 
阅读(1552) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~