天天看点

java实现文件的按照每次读取固定行数读取一个 文件 ,计算文件总行数和通过LINUX 命令读取固定行数文件内容,计算文件总行数...

1 ) java实现文件的按照每次读取固定行数读取一个文件

/**
	 * 
	 * @param fileRowCount 文件的总行数
	 * @param firstReadRowNum 第一次读取文件的行数
	 * @param lastReadRowNum 下一次要读取文件的行数
	 * @param fileName 文件的名称
	 */
	public void readFile(int fileRowCount, int firstReadRowNum, String fileName) {
		// readFileName
		LineNumberReader lineReader = null ;
		try {
			lastReadRowNum = firstReadRowNum;
			while (lastReadRowNum < fileRowCount) {
				if (Common.dataList.size() >= listSize) {
					logger.info("队列超过最大值:" + Common.dataList.size());
					try {
						Thread.currentThread().sleep(5000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {
					lastReadRowNum = firstReadRowNum + readRowCount;
					if (lastReadRowNum > fileRowCount) {
						lastReadRowNum = fileRowCount;
					}
//					fileContent = sendMand(firstReadRowNum, lastReadRowNum,
//							lastReadRowNum, fileName);
					
					String dataStr = null ; //需要处理的字符串
					StringBuffer rtnBuf = new StringBuffer();
					int lineNum =0 ;
					int count = 0 ;
					String path="";
					path = Common.homePath+File.separator+fileName;
					File file = new File(path); 
					logger.info("构建文件对象成功,文件对象名是:"+path);
					lineReader = new LineNumberReader(new FileReader(file)); 
					logger.info("开始从定位到到需要读取的起始行是:"+firstReadRowNum);
					
					while((dataStr=lineReader.readLine())!=null){
						lineNum = lineReader.getLineNumber() ;
						/**
						 * 在起始行号和最后行号之间
						 */
						if(lineNum >=firstReadRowNum && lineNum<lastReadRowNum ){
							if(lineNum == firstReadRowNum ){
								logger.info("定位到需要读取的行号是:"+firstReadRowNum+",读取到的行号是:"+lastReadRowNum);
							}
							rtnBuf.append(dataStr+"\n");
						}
						if(lineNum==lastReadRowNum) {
							count++ ;
							logger.info("循环读取文件:"+count+"次,每次读取"+readRowCount+"行成功,起始行数是:"+firstReadRowNum+"终止行数是:"+lastReadRowNum);
							
							fileContent=rtnBuf.toString() ;
							
							dbTelnetFile = new DbTelnetFile();
							dbTelnetFile.setSFileName(readFileName);
							dbTelnetFile.setEmsName(emsName);
							dbTelnetFile.setILastLine(lastReadRowNum);
							dbTelnetFile.setStartRow(firstReadRowNum);
							dbTelnetFile.setEndRow(lastReadRowNum);
							dbTelnetFile.setContent(fileContent);
							
							/**
							 * 检查队列的大小是否已经超过最大值
							 */
							while(Common.dataList.size() >= listSize) {
								logger.info("队列超过最大值:" + Common.dataList.size());
								try {
									Thread.currentThread().sleep(5000);
								} catch (InterruptedException e) {
									e.printStackTrace();
								}
							}
							// 放入到队列中…………
							Common.dataList.offer(dbTelnetFile);
//							Common.dataList.add(dbTelnetFile);
							logger.info("将对象TelnetFile成功放入到队列中,iLastLine:"+dbTelnetFile.getILastLine()+",");
							firstReadRowNum = lastReadRowNum;
							lastReadRowNum = firstReadRowNum + readRowCount;
							if (lastReadRowNum > fileRowCount) {
								lastReadRowNum = fileRowCount;
							}
							/**
							 * 用最后一次读取的值,构建StringBuffer对象
							 */
							rtnBuf = new StringBuffer(dataStr+"\n");
							dbTelnetFile = null ;
						}
					}
					
				}
			}

			logger.info("读取文件" + readFileName + "成功");
		} catch (Exception e) {
			e.printStackTrace() ;
			logger.error("读取文件错误"+e.getMessage());
		}finally{
			/**
			 * 关闭文件流对象
			 */
			if(lineReader !=null){
				try {
					lineReader.close() ;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
           

2)java实现计算文件总行数(计算一个9百万行的文件需要的时间效率大约是13S)

/**
	 *通过java 程序获取文件的行数
	 * @return
	 */
	public int getFileRowCountBy(String fileName){
		logger.info("统计文件行数开始:") ;
		long temp = +System.currentTimeMillis() ;
		int num = 0;
		LineNumberReader  lineReader = null ;
		try{
		
			String path="";
			path = Common.homePath+File.separator+fileName;
			File file = new File(path); 
			logger.info("构建文件对象成功,文件对象名是:"+path);
			lineReader = new LineNumberReader(new FileReader(file)); 
			while((lineReader.readLine())!=null){
				num++ ;
			}
			logger.info("统计文件行数结束,用的时间是:"+(System.currentTimeMillis()-temp)/1000+"s") ;
			logger.info("文件的一共有: "+num+" 行");
		}catch(Exception e){
			logger.error("获取文件总行数异常:"+e.getMessage());
			e.printStackTrace() ;
		}finally{
			if(lineReader != null){
				try{
					lineReader.close() ;
				}catch(Exception e){
					logger.error("关闭文件异常");
					e.printStackTrace() ;
				}
				
			}
		}
		
		return num ;
	}
           

3) 通过LINUX 命令读取固定行数文件内容,由java调用

public String sendMand(int beginRow,int endRow,int readRowCount,String fileName) throws Exception{
		if(beginRow ==0){
			beginRow =1 ;
		}
		String returnResult = "" ;
		String cmd = "sed -n '"+beginRow+","+endRow+"p;"+endRow+"q' "+fileName;
		logger.info("需要发送:"+cmd+"开始");
		telnetManager.sendCommandAutoLine(cmd) ;
		returnResult = telnetManager.waitForStringReturn(telnetManager.getOsTag2(), 20000);
		logger.info("成功发送:"+cmd+"命令");
		logger.info(returnResult);
		return returnResult ;
	}
           

4)通过LINUX 命令计算文件总行数,由java调用

/**
	 * 通过linux 命令获取文件行数
	 * @param fileName
	 * @return
	 */
	public String getFileRowCount(String fileName) {
		String fileRowCountStr="";
		String sub="" ;
		try{
			String cmdValue = "cat "+fileName+" | wc -l" ;
			telnetManager.sendCommandAutoLine(cmdValue);
			fileRowCountStr = telnetManager.waitForStringReturn(telnetManager.getOsTag2(), 20000);
			int index1 = fileRowCountStr.indexOf("\r\n");
			int index2 = fileRowCountStr.lastIndexOf("\r\n");
			if(index1 !=-1&& index2 !=-1){
				sub = fileRowCountStr.substring(index1, index2) ;
				if(sub != null &&!"".equals(sub)){
					sub = sub.replaceAll("\r\n","");
				}
				if("".equals(sub)){
					sub = fileRowCountStr.substring(0, index2) ;
				}
			}
			else {
				 index1 = fileRowCountStr.indexOf("\n");
				 index2 = fileRowCountStr.lastIndexOf("\n");
				 if(index1 != -1&& index2 != -1){
					 sub = fileRowCountStr.substring(index1, index2) ;
					 sub = sub.replaceAll("\n","");
				 }
				 if("".equals(sub)){
						sub = fileRowCountStr.substring(0, index2) ;
					}
			}
		}catch(Exception e){
			
		}
		
		fileRowCountStr = sub.trim();
		return fileRowCountStr;
	}