⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanv3perdatafile.java

📁 解析特定16进制文件
💻 JAVA
字号:
/**
 * @(#)ScanPerDataFileProcess.java	  Nov 3, 2006 3:13:25 PM
 * 
 * COPYRIGHT DaTang Mobile Communications Equipment CO.,LTD
 */
package com.datangmobile.oss.omc.pc.v3file;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.datangmobile.oss.omc.common.exception.FTPException;
import com.datangmobile.oss.omc.common.exception.NeaException;
import com.datangmobile.oss.omc.pc.PmContext;
import com.datangmobile.oss.omc.pc.ParseFileQueue;
import com.datangmobile.oss.omc.pc.PmConst;
import com.datangmobile.oss.omc.pc.util.FileInfo;
import com.datangmobile.oss.omc.pc.util.FileParserUtil;
import com.datangmobile.oss.platform.util.FTPFileInfo;
import com.datangmobile.oss.platform.util.FTPInfo;
import com.datangmobile.oss.platform.util.ILogger;
import com.datangmobile.oss.platform.util.ModuleLogger;

import cz.dhl.ftp.Ftp;
import cz.dhl.ftp.FtpConnect;
import cz.dhl.ftp.FtpFile;
import cz.dhl.io.CoFile;
import cz.dhl.io.CoLoad;
import cz.dhl.io.LocalFile;

/**
 * 论询文件处理类
 * 
 * @author liuyuan
 * @version 1.0
 * 
 * CNBUG00018019 由于性能数据文件为zip格式,导致解析时出现内存溢出异常
 * @author liuyuan
 * @version 1.1
 * 
 * CRMCN00003777 2008-5-29 多版本管理 需要加入网元dn,以判断网元的版本号
 * @author liuyuan
 * @version 1.2
 */
public class ScanV3PerDataFile {

	private FtpConnect cn;

	private Ftp cl;

	private String user;

	private String passwd;

	private String ftpserverip;

	private String path;

	/**
	 * 用于记录原始路径
	 */
	private String rootPath;

	/**
	 * 日志记录器
	 */
	private static final ILogger log = ModuleLogger.getPmLogger()
			.getOperLogger();

	private static ScanV3PerDataFile scanV3PerDataFile = new ScanV3PerDataFile();

	/**
	 * 单例类
	 * 
	 * @return
	 */
	public static ScanV3PerDataFile getInstance() {
		return scanV3PerDataFile;
	}

	/**
	 * 初始化得到连接ftp服务器的配置信息
	 * 
	 * @throws NeaException
	 * 
	 */
	private void init() throws FTPException {

		try {
			// 获取FTP的地址
			FTPInfo ftpInfo = PmContext.getPmContext().createFtpInfo();

			ftpserverip = ftpInfo.getIP();
			user = ftpInfo.getUser();
			passwd = ftpInfo.getPassword();

			path = PmConst.PM_DIR + File.separator;
			//xingyong 2008-11-11 在windows单机版的jboss无法解析文件
			//所以需要对windows特殊处理
			String osName = System.getProperty("os.name");
			if(osName.startsWith("Windows")){
				path = PmConst.PM_DIR + "/";
			}

			cn = FtpConnect.newConnect("ftp://" + ftpserverip);
			cn.setUserName(user);
			cn.setPassWord(passwd);
		} catch (Exception e) {
			throw new FTPException(
					"init v3 ftpinfo from cmsever occurs errors!", e);
		}

	}

	/**
	 * 扫描FTP服务器目录path 返回目录下文件的信息
	 * 
	 * @param path
	 * @return
	 */
	private FTPFileInfo[] scanFTPServer(String path) throws FTPException {
		FTPFileInfo[] infos = null;
		try {
			rootPath = cl.pwd();
			/* 到ftp服务器指定工作目录下 */
			if (!cl.cd(path)) {
				log.error(ScanV3PerDataFile.class, "cannot find Dir: " + path
						+ " in FTP: " + ftpserverip);
				return null;
			}
			/* get current directory */
			CoFile dir = new FtpFile(cl.pwd(), cl);

			/* list & print current directory */
			if (dir != null) {
				CoFile fls[] = dir.listCoFiles();
				infos = new FTPFileInfo[fls.length];
				for (int i = 0; i < fls.length; i++) {
					infos[i] = new FTPFileInfo();
					infos[i].setDirectory(fls[i].isDirectory());
					infos[i].setLastModifiedDate(fls[i].lastModifiedString());
					infos[i].setName(fls[i].getName());
					infos[i].setSize(fls[i].length());
				}
			}
		} catch (Exception e) {
			throw new FTPException(
					"Get v3 files info from ftp server occurs error! "
							+ ftpserverip);
		}
		return infos;

	}

	/**
	 * 对文件列表进行判断,返回符合性能数据文件名格式要求的
	 * 
	 * @param fileinfo
	 * @return
	 */
	private String[] getPerDataFiles(FTPFileInfo[] fileinfo) {
		if (fileinfo == null) {
			return null;
		}

		List<String> filenames = new ArrayList<String>();
		for (int i = 0; i < fileinfo.length; i++) {
			/* 符合要求的文件返回 */
			if (!fileinfo[i].isDirectory()
					&& isV3PerData(fileinfo[i].getName())) {
				filenames.add(fileinfo[i].getName());
			}
		}
		String[] names = new String[filenames.size()];
		filenames.toArray(names);
		return names;
	}

	/**
	 * 性能数据文件名 pm20080617_rnc_1030.dat or zip<br>
	 * 小区对文件名 cellho_0002_20080617_1030.dat or zip
	 * 
	 * @param filename
	 * @return
	 */
	public boolean isV3PerData(String filename) {
		// 小区对的文件一定会解析
		String[] s = filename.split(PmConst.PM_DATA_FILE_SEPARATOR);
		// 小区对的文件
		if ((s.length == 4)
				&& s[0].startsWith(PmConst.PM_V3_CDL_FILE_PREFIX)
				&& (filename.endsWith(PmConst.PM_DAT) || filename
						.endsWith(PmConst.PM_ZIP))) {
			return true;
		}

		if (PmContext.getPmContext().isParseDataFile()) {// 解析v3、v2数据文件
			/*
			 * 3.40.30的文件格式和4.00.00的文件格式不一样, 3.40.30:pm20080617_rnc_1030.dat
			 * 4.00.00:pm_rnc_0012_2008901_0045.dat
			 */
			if ((s.length == 3 || s.length == 5)
					&& s[0].startsWith(PmConst.PM_V3_DATA_FILE_PREFIX)
					&& (filename.endsWith(PmConst.PM_ZIP) || filename
							.endsWith(PmConst.PM_DAT))) {
				/* 第二个字段为规定的网元类型 */
				if (s[1].startsWith(PmConst.NETYPE_RNC)
						|| s[1].startsWith(PmConst.NETYPE_MSCS)
						|| s[1].startsWith(PmConst.NETYPE_GGSN)
						|| s[1].startsWith(PmConst.NETYPE_SGSN)
						|| s[1].startsWith(PmConst.NETYPE_MGW)
						|| s[1].startsWith(PmConst.NETYPE_HLR)
						|| s[1].startsWith(PmConst.NETYPE_NODEB)) {
					return true;
				}
			}
		}

		return false;

	}

	/**
	 * 下载文件
	 * 
	 * @param file
	 * @return
	 */
	public boolean downLoadFile(String file) throws FTPException {
		boolean ret = false;

		cl.cd(rootPath);

		// source file local file
		CoFile local = new LocalFile(path + file);

		// 如果给的本地文件路径是temp\\dest\\1.wav
		// 在在创建该文件的时候,还需要创建该文件的parent(一个dir)
		File parent = ((LocalFile) local).getParentFile();
		if (parent != null && !parent.exists())
			parent.mkdirs();
		CoFile svrFile = new FtpFile(path + file, cl);

		// 从服务器上下载文件
		ret = CoLoad.copy(local, svrFile);
		return ret;
	}

	/**
	 * 删除ftp服务器文件 FTP的当前目录是性能数据文件保存的目录,所以file为直接的文件名
	 * 
	 * @param file
	 * @return
	 * @throws FTPException
	 */
	private boolean deleteServerFile(String file) throws FTPException {
		boolean ret = false;
		try {
			cl.cd(path);
			ret = cl.rm(file);
			return ret;
		} catch (Exception e) {
			log
					.error(
							"Delete v3 perdata file on ftp Server perdata file occurs errors!",
							e);
			if (cl != null) {
				cl.disconnect();
			}
			throw new FTPException("delete v3 file " + file
					+ " from ftp server occurs errors!" + ftpserverip);
		}
	}

	/**
	 * 执行扫描 判断 下载任务
	 * 
	 * @throws FTPException
	 * @throws IOException
	 */
	public void scanV3FileTask() throws Throwable {

		try {
			// 初始化
			init();
			try {
				cl = new Ftp();
				cl.getContext().setConsole(null);
				cl.connect(cn);
			} catch (Exception e) {
				throw new FTPException("connect ftp server occurs errors!"
						+ ftpserverip, e);
			}
			FTPFileInfo[] ftpFileInfo = scanFTPServer(path);
			String[] files = getPerDataFiles(ftpFileInfo);

			/* 如果轮询之后没有性能数据文件,则返回 */
			if (files == null || files.length == 0) {
				return;
			}

			for (String str : files) {
				if (downLoadFile(str)) {
					/* 下载后,如果删除ftp服务器文件出现异常,则需要把本地的文件也要删除 */
					if (!deleteServerFile(str)) {
						new File(path + str).delete();
					} else {
						/* 把成功下载的文件名加入解析队列中 */
						String[] s = str.split("_");
						String netype = s[1].toUpperCase();

						/* 把成功下载的文件名加入解析队列中 */
						String fileType = "";
						if (str.startsWith(PmConst.PM_V3_DATA_FILE_PREFIX)) {// 性能统计上报文件
							fileType = PmConst.PM_V3_DATA_FILE;
						} else if (str
								.startsWith(PmConst.PM_V3_CDL_FILE_PREFIX)) {// 小区对上报文件
							fileType = PmConst.PM_V3_CDL_FILE;
						}

						// add by liuyuan 2008-3-21 加入对性能数据文件的处理(zip格式)
						// CNBUG00018019
						if (str.endsWith(PmConst.PM_ZIP)) {// 压缩文件
							File dir = new File(System.getProperty("user.dir")
									+ File.separator + PmConst.PM_DIR);
							try {
								ArrayList<String> pmFiles = FileParserUtil
										.unzipFile(dir.getAbsolutePath()
												+ File.separator, str);
								for (String string : pmFiles) {
									FileInfo fileinfo = new FileInfo();
									String t = string.substring(string
											.lastIndexOf(File.separator) + 1);
									fileinfo.setFile(new File(path + t));
									fileinfo.setFileType(fileType);
									// 是V3数据文件才需设置NeType、Dn属性,而V3小区对文件则不需要
									if (PmConst.PM_V3_DATA_FILE
											.equals(fileType)) {
										fileinfo.setNeType(netype);
										fileinfo.setDn(FileParserUtil
												.getNeDn(t));
									}
									// 将这些info发如待解析的队列中
									ParseFileQueue.getInstance().putParseFile(
											fileinfo);
								}
								new File(path + str).delete();
							} catch (IOException e) {
								log.error("解压文件到PM目录失败!" + str, e);
							}
						} else {// 可直接解析的二进制文件
							FileInfo fileinfo = new FileInfo();
							fileinfo.setFile(new File(path + str));
							fileinfo.setFileType(fileType);
							// 是V3数据文件才需设置NeType、Dn属性,而V3小区对文件则不需要
							if (PmConst.PM_V3_DATA_FILE.equals(fileType)) {
								fileinfo.setNeType(netype);
								fileinfo.setDn(FileParserUtil.getNeDn(str));
							}
							// 将这些info发如待解析的队列中
							ParseFileQueue.getInstance().putParseFile(fileinfo);
						}

					}
				} else {// 下载失败
					throw new FTPException("download v3 file " + str
							+ " from ftp server occurs errors!" + ftpserverip);

				}
			}
		} catch (Throwable e) {
			throw new Throwable(e.getMessage(), e);
		} finally {
			if (cl != null) {
				cl.disconnect();
			}
		}
	}


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -