标签:
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使用多线程操作。
实测效率比边查找边修改效率要好。
标签:
原文地址:http://www.cnblogs.com/tonyliult/p/4535442.html