问题描述
//最近一两天突然想写一个可以从rar文件中提取文件的程序,具体的代码如下:import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;import java.util.regex.Matcher;import java.util.regex.Pattern; public class Test { private static ArrayList<File> myFile = new ArrayList<File>(); private String flag = "flag"; private ArrayList<File> tempFile = new ArrayList<File>(); private Process pro; public void rarFile(String src, String name) {// src表示当前路径, Pattern p = Pattern.compile(".*\.rar$"); Matcher m = p.matcher(name); if (m.matches()) { synchronized (this) { try { //解压文件 pro = Runtime.getRuntime().exec( "cmd /c start winrar x " + src + "\" + name + " -r " + "" + src); } catch (IOException e) { e.printStackTrace(); } /*如何让主线程等待pro执行玩后在继续执行呢?*/ int index = name.lastIndexOf("."); String fileName = name.substring(0, index); File ff = new File(src + "\" + fileName); getFile(ff); tempFile.add(ff); } } } //获取文件 public void getFile(File f) { // System.out.println(f); if (f.isDirectory()) { File[] list = f.listFiles(); for (int i = 0; i < list.length; i++) getFile(list[i]); } else { String name = f.getName(); String pattern = ".*\.rar$|.*\.pdf$";//提取pdf文件和rar文件 Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(name); if (m.matches()) { String str = ".*\.pdf$"; p = Pattern.compile(str); m = p.matcher(name); if (m.matches()) { myFile.add(f); } else { rarFile(f.getParent(), f.getName()); } } } } public static void main(String[] args) { Test tt = new Test(); tt.getFile(new File("f:\test")); Iterator<File> it = myFile.iterator(); while (it.hasNext()) System.out.println(it.next()); }}如何使主线程等待pro执行完毕在继续往下执行呢?参阅了网上的很多方法,还是不行... 问题补充:<div class="quote_title">Wind_ZhongGang 写道</div><div class="quote_div">完全没有领会你的意思。你的方法执行都是在主线程中,并且方法的执行本身并不是另一个线程,是按照顺序执行的,完全可以达到你所想要的效果,根本不存在线程同步的问题啊。</div><br /><br />谢谢你的回复,我的问题是还没有待pro执行完毕,也就是解压出来的就是一个空壳子,里面并没有我想要的文件,而主程序继续往下执行getFile方法,因而没有得到想要的文件,这点可以在getFile里面加上System.out.println(f)打印来证实,首次发帖,恐词不达意,勿怪
解决方案
InputStream is=pro.getInputStream();while(is.read()!=-1);
解决方案二:
引用谢谢你的回复,我的问题是还没有待pro执行完毕,也就是解压出来的就是一个空壳子,里面并没有我想要的文件,而主程序继续往下执行getFile方法,因而没有得到想要的文件,这点可以在getFile里面加上System.out.println(f)打印来证实,首次发帖,恐词不达意,勿怪确实没有看出来你这里面有多线程,之所以没有解压到你想要的文件,请检查你获取文件的时候是否正确?
解决方案三:
完全没有领会你的意思。你的方法执行都是在主线程中,并且方法的执行本身并不是另一个线程,是按照顺序执行的,完全可以达到你所想要的效果,根本不存在线程同步的问题啊。