问题描述
Processp=Runtime.getRuntime().exec(unrarCmd);iState=p.waitFor();核心语句就是上面两句,语句都正确,但只有在Tamcat重启时才能正常解压一次,很是郁闷,不知道怎么解决,如有高手赐教,不胜感激。
解决方案
解决方案二:
该回复于2010-01-30 22:55:22被版主删除
解决方案三:
路过,两行代码看不出什么问题,整个流程贴出来还差不多
解决方案四:
....代码给的太少了,给你个能用的解压缩例子。java解压缩文件importjava.io.*;importjava.util.*;importjava.util.zip.*;publicclassUnzip{publicstaticvoidmain(String[]args){Stringunzipfile="d:\test\test.zip";//解压缩的文件名try{Fileolddirec=newFile(unzipfile);//解压缩的文件路径(为了获取路径)ZipInputStreamzin=newZipInputStream(newFileInputStream(unzipfile));ZipEntryentry;//创建文件夹while((entry=zin.getNextEntry())!=null){if(entry.isDirectory()){Filedirectory=newFile(olddirec.getParent(),entry.getName());if(!directory.exists())if(!directory.mkdirs())System.exit(0);zin.closeEntry();}if(!entry.isDirectory()){FilemyFile=newFile(entry.getName());FileOutputStreamfout=newFileOutputStream("d:\test\"+myFile.getPath());DataOutputStreamdout=newDataOutputStream(fout);byte[]b=newbyte[1024];intlen=0;while((len=zin.read(b))!=-1){dout.write(b,0,len);}dout.close();fout.close();zin.closeEntry();}}}catch(IOExceptione){e.printStackTrace();System.out.println(e);}}}
解决方案五:
在java中调用操作系统的程序时,可以使用java.lang.Runtime.getRuntime().exec()来实现,但是这个方法在调用命令后就直接返回当前线程了;程序设计时,有时候需要在等待调用的系统程序完成操作后,当前线程才能做下一步操作,此时可以用类Process的方法waitFor()来实现,它会阻塞当先线程直至调用程序运行结束Java代码java.lang.Processprocess=java.lang.Runtime.getRuntime().exec("");//执行命令生成cubetry{process.waitFor();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}proc_stat=checkFileSize()?"1":"3";java.lang.Processprocess=java.lang.Runtime.getRuntime().exec("");//执行命令生成cubetry{process.waitFor();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}proc_stat=checkFileSize()?"1":"3";Process的方法waitFor()介绍,取自API文档:waitForpublicabstractintwaitFor()throwsInterruptedException导致当前线程等待,如果必要,一直要等到由该Process对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程。返回:进程的出口值。根据惯例,0表示正常终止。抛出:InterruptedException-如果当前线程在等待时被另一线程中断,则停止等待,抛出InterruptedException。转载的,看看有帮助没有
解决方案六:
会不会发生I/O时等待输入参数之类的?
解决方案七:
引用3楼sotom的回复:
....代码给的太少了,给你个能用的解压缩例子。java解压缩文件Javacodeimportjava.io.*;importjava.util.*;importjava.util.zip.*;publicclassUnzip{publicstaticvoidmain(String[]args){Stringunzipfile="d:\test\test.zip";//解压缩的文件名try{Fileolddirec=newFile(unzipfile);//解压缩的文件路径(为了获取路径)ZipInputStreamzin=newZipInputStream(newFileInputStream(unzipfile));ZipEntryentry;//创建文件夹while((entry=zin.getNextEntry())!=null){if(entry.isDirectory()){Filedirectory=newFile(olddirec.getParent(),entry.getName());if(!directory.exists())if(!directory.mkdirs())System.exit(0);zin.closeEntry();}if(!entry.isDirectory()){FilemyFile=newFile(entry.getName());FileOutputStreamfout=newFileOutputStream("d:\test\"+myFile.getPath());DataOutputStreamdout=newDataOutputStream(fout);byte[]b=newbyte[1024];intlen=0;while((len=zin.read(b))!=-1){dout.write(b,0,len);}dout.close();fout.close();zin.closeEntry();}}}catch(IOExceptione){e.printStackTrace();System.out.println(e);}}}
学习了
解决方案八:
我的程序也有这个问题,我在网上找了很多资料,才查到,在jdk1.4以后,waitfor()之前必须要执行接受outputsream的动作,否则,命令执行出错时,会挂在那里在waitfor()之前,先执行p.getErrorStream();p.getInputStream();完成读取outputsream的动作,而且一定记得p.getErrorStream();和p.getInputStream();顺序是不能颠倒的。我现在也在测试,因为环境无法模拟,所以正在等待结果。