合并文件的java实现

29 篇文章 0 订阅
14 篇文章 0 订阅

对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个文件,进行右键操作就调用这个方法实现文件合并,

这个应该怎么弄呢?


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值