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) |