public class ZipFileTest { private FTPClient ftpClient;

public void loginFtp(){
this.ftpClient = new FTPClient();
try {

this.ftpClient.connect("192.168.10.107", 21);
this.ftpClient.login("admin", "admin");
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public ZipFileTest(String zipPath,String remoteName){
loginFtp(); //登录FTP
ZipEntry ze;
byte[] bt = new byte[1024];
int len=0;
try {

ftpClient.cwd(zipPath); 
System.out.println(ftpClient.printWorkingDirectory());

InputStream is =this.ftpClient.retrieveFileStream(remoteName);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

System.out.println(ftpClient.printWorkingDirectory());
ZipInputStream zis = new ZipInputStream(is);

while((ze = zis.getNextEntry())!=null){

if(ze.isDirectory() ){

String[] folders = ze.getName().split("/");

for(int i=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(int i=0;i<folders.length;i++){

if(!ftpClient.changeWorkingDirectory(folders[i])){
if(i==(folders.length-1)){
OutputStream ops = 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 (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static void main(String[] args) throws InterruptedException {
String remoteName = "Fishing_Reel.zip";
String zipPath = "/model/AO/AOTR/PRODECT/";
new ZipFileTest(zipPath,remoteName);

}}
//----------------------------------我在调用 ftpClient.retrieveFileStream(remoteName) 这个方法之后
ftpClient.printWorkingDirectory() 这个方法就返回NULL,后面的在保存解压的文件时就会报java.lang.NullPointerException

解决方案 »

  1.   

    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);如果我把上面这行改为
    //ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
    ftpClient.completePendingCommand();
    则ftpClient.printWorkingDirectory()输出正常目录,但是遇到稍大一点的ZIP文件就会假死这在。在网上查了一下要调用ftpClient.printWorkingDirectory()之前必需先调用InputStream.Close(),如果关了输入流那我下面的ZipInputStream就会报错。
      

  2.   

    InputStream is =this.ftpClient.retrieveFileStream(remoteName); 是不是这句的错误这句是干什么的?我怎么没用过....
      

  3.   


    通过调用这个方法retrieveFileStream(remoteName)得到一个文件输入流,在后面会把这个输入流放进
    ZipInputStream zis = new ZipInputStream(is);
    为了得到一个压缩文件流,担是我在InputStream is =this.ftpClient.retrieveFileStream(remoteName);这一行后面加上ftpClient.completePendingCommand();
    ftpClient.printWorkingDirectory()就可以正常输出