码迷,mamicode.com
首页 > 其他好文 > 详细

快速批量修改cvs的root文件

时间:2015-05-28 12:30:54      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

  1 import java.io.File;
  2 import java.io.FileOutputStream;
  3 import java.io.IOException;
  4 import java.util.LinkedList;
  5 
  6 public class ModifyCVSIPV2 {
  7     
  8     private static final String OVER_FLAG="GAMEOVER";
  9     
 10     private static void searchCVSFiles(File directory) {
 11         if (directory.isDirectory()) {
 12             File[] files = directory.listFiles();
 13             for (File file : files) {
 14                 if (file.isDirectory()) {
 15                     if ("CVS".equals(file.getName())) {
 16                         File[] cvsfiles=file.listFiles();
 17                         for(File filetmp:cvsfiles){
 18                             if("Root".equals(filetmp.getName())){
 19                                 //入队列
 20                                 FileQueue.getInstance().offer(filetmp.getPath());
 21                             }
 22                         }
 23                     } else {                        
 24                         searchCVSFiles(file);
 25                     }
 26                 }
 27             }
 28         }else{
 29             System.out.println("Not directory!");
 30         }        
 31     }
 32     
 33     public static void searchCVSFiles(String directory){
 34         searchCVSFiles(new File(directory));
 35         //搜索完毕,队列置入结束标记OVER_FLAG
 36         FileQueue.getInstance().offer(OVER_FLAG);
 37     }
 38     
 39     public static void modifyCVSIP(){
 40         int num = 10;
 41         for(int i =1; i<=num; i++){
 42             new Thread("线程"+i){
 43                 public void run(){
 44                     while(true){
 45                         String filename = FileQueue.getInstance().poll();
 46                         if(filename == null){
 47                             try {
 48                                 sleep(100);
 49                             } catch (InterruptedException e) {
 50                                 e.printStackTrace();
 51                             }
 52                         }else if(OVER_FLAG.equals(filename)){
 53                             FileQueue.getInstance().offer(OVER_FLAG);
 54                             break;//完成更新,线程退出
 55                         }else{
 56                             try {
 57                                 FileOutputStream out = new FileOutputStream(new File(filename));
 58                                 out.write(":pserver:[用户名]:[密码]@[ip]:[port]/cvs".getBytes());
 59                                 out.close();
 60                             } catch (IOException e) {
 61                                 e.printStackTrace();
 62                             }    
 63                             
 64                         }
 65                     }
 66                     System.out.println(this.getName()+"修改完毕!");
 67                 }
 68             }.start();
 69         }
 70     }
 71 
 72     public static void main(String[] args) {        
 73         long s1 = System.currentTimeMillis();
 74         searchCVSFiles("E:\\cvs20130525");
 75         long e1 = System.currentTimeMillis();
 76         System.out.println("搜索完毕, 耗时:"+((float)(e1-s1)/1000)+"秒,"+"需要修改文件数:"+FileQueue.getInstance().size());
 77         System.out.println("开始修改...");
 78         modifyCVSIP();
 79     }
 80 }
 81 
 82 class FileQueue{
 83     private final LinkedList<String> QUEUE = new LinkedList<String>();
 84     
 85     private static class FileQueueHolder {
 86         public static final FileQueue instance = new FileQueue();
 87     };    
 88     
 89     public static FileQueue getInstance(){
 90         return FileQueueHolder.instance;
 91     }    
 92     
 93     public synchronized void offer(String fileFullName){
 94         QUEUE.offer(fileFullName);
 95     }
 96     
 97     public synchronized String poll(){
 98         return QUEUE.poll();
 99     }    
100     
101     public synchronized int size(){
102         return QUEUE.size();
103     }    
104     
105     private FileQueue(){}
106 }

工作环境目录过多,cvs服务器ip变动,要修改root文件几万个,ue批量修改太慢卡死,自己写个批量修改速度甚好。

我只是修改ip,当然只要是修改root文件,这程序都行:

1.把58行的cvs串修改成你最终想要的字符串。

2.74行换成本地cvs根目录,程序会从这个目录查找并替换所有子目录root里字符串。

 

(1)单线程递归查找的速度很快,就没开启多线程查找。

(2)为什么不让线程一边查找一边修改,因为队列有同步锁,反而造成阻塞,效率不高。

程序的目的就是为解IO阻塞,阻塞在哪就把它单独拎出来,将查找和IO拆分并先后进行,后续IO使用多线程操作。

实测效率比边查找边修改效率要好。

快速批量修改cvs的root文件

标签:

原文地址:http://www.cnblogs.com/tonyliult/p/4535442.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!