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
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;
}