对2个有序的log文件进行合并,时间复杂度是线性的,
设计:读文件,把2个文件里的内容分别按行数据保存到数组中,然后合并数组数据,最后再写到文件中
在写这个程序的时候,处理合并数组的时候,灵光一现,考虑利用null进行标记,处理一个数组到达末尾的情况
所以用到了
while (aPos < alen || bPos < blen)
这样的写法
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class MergeFile {
public void FileInputStreamToList(String path, List<String> list)
throws IOException{
// List<String> list = new ArrayList<String>();
File file=new File(path);
if(!file.exists()||file.isDirectory())
throw new FileNotFoundException();
String str = null;
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
while ((str = br.readLine()) != null)
{
list.add(str + "\n");
}
br.close();
isr.close();
fis.close();
}
public void writeFileFromList(String path, List<String> list)
throws IOException
{
int cacheNum = 60;
File file = new File(path);
if(!file.exists())
file.createNewFile();
FileOutputStream out = new FileOutputStream(file, true);
StringBuffer sb = new StringBuffer();
for(int i = 0; i < list.size(); i++)
{
sb.append(list.get(i));
//sb.toString().getBytes("utf-8")
if (i % cacheNum == 0)
{
out.write(sb.toString().getBytes());
sb = new StringBuffer();
}
}
out.write(sb.toString().getBytes());
out.close();
}
private boolean compareLogstr(String aString, String bString)
{
//continue use this function when the str is null
if (aString == null)
{
return true;
}
if (bString == null)
{
return false;
}
if (aString.compareTo(bString) > 0)
{
return true;
}
return false;
}
public void mergeList(List<String> alist, List<String> blist,
List<String> mlist)
{
//01-02 03:21:51.219039 1120 1143
int alen = alist.size();
int blen = blist.size();
int aPos = 0;
int bPos = 0;
// while (aPos < alen && bPos < blen) //csdn aaajj
while (aPos < alen || bPos < blen)
{
String aString = aPos < alen? alist.get(aPos): null;
String bString = bPos < blen? blist.get(bPos): null;
if (compareLogstr(aString, bString))
{
mlist.add("B " + blist.get(bPos));
bPos++;
}
else
{
mlist.add("A " + alist.get(aPos));
aPos++;
}
}
}
public static void main(String[] args)
{
if (args.length < 2)
{
System.out.println("args num is " + args.length);
return;
}
MergeFile mergeFile = new MergeFile();
List<String> alist = new ArrayList<String>();
List<String> blist = new ArrayList<String>();
List<String> mlist = new ArrayList<String>();
try {
System.out.println("begin");
// mergeFile.FileInputStreamToList("D:\\2016\\03\\test\\main_log", alist);
// mergeFile.FileInputStreamToList("D:\\2016\\03\\test\\sys_log", blist);
mergeFile.FileInputStreamToList(args[0], alist);
mergeFile.FileInputStreamToList(args[1], blist);
System.out.println("alist len = " + alist.size());
System.out.println("blist len = " + blist.size());
mergeFile.mergeList(alist, blist, mlist);
System.out.println("mlist len = " + mlist.size());
// mergeFile.writeFileFromList("D:\\2016\\03\\test\\mlog.txt", mlist);
mergeFile.writeFileFromList(args.length < 3? "mlog.txt": args[2],
mlist);
//test to write alist to file
// mergeFile.writeFileFromList("D:\\2016\\03\\test\\main_log2", alist);
System.out.println("done");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
java MergeFile a.log b.log 就可以产生合并后的文件了
便捷化扩展:
在windows环境中,添加一个右键操作,选中2个文件,进行右键操作就调用这个方法实现文件合并,
这个应该怎么弄呢?