问题描述
publicclassZipFileTest{privateFTPClientftpClient;publicvoidloginFtp(){this.ftpClient=newFTPClient();try{this.ftpClient.connect("192.168.10.107",21);this.ftpClient.login("admin","admin");}catch(SocketExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}publicZipFileTest(StringzipPath,StringremoteName){loginFtp();//登录FTPZipEntryze;byte[]bt=newbyte[1024];intlen=0;try{ftpClient.cwd(zipPath);System.out.println(ftpClient.printWorkingDirectory());InputStreamis=this.ftpClient.retrieveFileStream(remoteName);ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);System.out.println(ftpClient.printWorkingDirectory());ZipInputStreamzis=newZipInputStream(is);while((ze=zis.getNextEntry())!=null){if(ze.isDirectory()){String[]folders=ze.getName().split("/");for(inti=0;i<folders.length;i++){if(!ftpClient.changeWorkingDirectory(folders[i])){//System.out.println(ftpClient.printWorkingDirectory());ftpClient.makeDirectory(folders[i]);}ftpClient.changeWorkingDirectory(folders[i]);}ftpClient.changeWorkingDirectory(zipPath);}else{//System.out.println(ftpClient.printWorkingDirectory());String[]folders=ze.getName().split("/");for(inti=0;i<folders.length;i++){if(!ftpClient.changeWorkingDirectory(folders[i])){if(i==(folders.length-1)){OutputStreamops=ftpClient.storeFileStream(folders[i]);while((len=zis.read(bt,0,1024))!=-1){ops.write(bt,0,len);}ops.close();}else{ftpClient.makeDirectory(folders[i]);}}ftpClient.changeWorkingDirectory(folders[i]);}ftpClient.changeWorkingDirectory(zipPath);}}is.close();zis.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}publicstaticvoidmain(String[]args)throwsInterruptedException{StringremoteName="Fishing_Reel.zip";StringzipPath="/model/AO/AOTR/PRODECT/";newZipFileTest(zipPath,remoteName);}}//----------------------------------我在调用ftpClient.retrieveFileStream(remoteName)这个方法之后ftpClient.printWorkingDirectory()这个方法就返回NULL,后面的在保存解压的文件时就会报java.lang.NullPointerException
解决方案
解决方案二:
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);如果我把上面这行改为//ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);ftpClient.completePendingCommand();则ftpClient.printWorkingDirectory()输出正常目录,但是遇到稍大一点的ZIP文件就会假死这在。在网上查了一下要调用ftpClient.printWorkingDirectory()之前必需先调用InputStream.Close(),如果关了输入流那我下面的ZipInputStream就会报错。
解决方案三:
InputStreamis=this.ftpClient.retrieveFileStream(remoteName);是不是这句的错误这句是干什么的?我怎么没用过....
解决方案四:
引用2楼dyllove98的回复:
InputStreamis=this.ftpClient.retrieveFileStream(remoteName);是不是这句的错误这句是干什么的?我怎么没用过....
通过调用这个方法retrieveFileStream(remoteName)得到一个文件输入流,在后面会把这个输入流放进ZipInputStreamzis=newZipInputStream(is);为了得到一个压缩文件流,担是我在InputStreamis=this.ftpClient.retrieveFileStream(remoteName);这一行后面加上ftpClient.completePendingCommand();ftpClient.printWorkingDirectory()就可以正常输出