2014-03-12 42 views
0

嗨我想连接FTP并读取文件并生成该文件的MD5校验和值,但我面临流关闭错误。这是我的代码。流关闭错误Groovy

import java.io.FileInputStream; 
import java.security.MessageDigest; 
import java.util.Properties; 
import java.io.InputStream; 
import java.io.ByteArrayInputStream; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import org.apache.commons.net.ftp.FTPClient; 

MessageDigest digest = MessageDigest.getInstance("MD5"); 

FTPClient ftp=new FTPClient(); 
ftp.enterLocalPassiveMode(); 
ftp.connect("address"); 
ftp.login('username','password'); 
InputStream iStream=ftp.retrieveFileStream("path of the file"); 
BufferedInputStream bInf=new BufferedInputStream(iStream); 
byte[] buffer = new byte[8192];  
int read = 0; 
while ((read = bInf.read(buffer)) !=-1) 
{ 
digest.update(buffer, 0, read); 
}; 

byte[] md5sum = digest.digest(); 
BigInteger bigInt = new BigInteger(1, md5sum) 
def x=bigInt.toString(16).padLeft(32,'0') 

请帮助我在哪里出了错

回答

1

我得到了它与下面的代码工作:

import java.security.MessageDigest 
import org.apache.commons.net.ftp.FTPClient 

MessageDigest digest = MessageDigest.getInstance("MD5") 

String md5 = new FTPClient().with { ftp -> 
    try { 
     ftp.enterLocalPassiveMode() 
     ftp.connect(address) 
     ftp.login(username, password) 
     ftp.retrieveFileStream(path).with { ins -> 
      if(ins == null) { 
       println "ERROR: $ftp.replyCode '${ftp.replyString.trim()}'" 
      } 
      else { 
       try { 
        ins.eachByte(8192) { buffer, nbytes -> 
         digest.update(buffer, 0, nbytes) 
        } 
        digest.digest().encodeHex().toString().padLeft(32, '0') 
       } 
       finally { 
        ins.close() 
       } 
      } 
     } 
    } 
    finally { 
     ftp.disconnect() 
    } 
} 

(假设你有addressusernamepasswordpath定义的变量)

+0

它说不能调用null对象的方法close()。它是在eachByte(8192){缓冲区,nbytes - > digest.update(缓冲区,0,nbytes) –

+0

不理解你的第二部分评论...无论如何,尝试一下,我更明确与我'用'变量名称。什么版本的Groovy?我用'2.2.2'和'commons-net:commons-net:3.3'来测试'FTPClient',它适用于我... –

+0

其实retrieveFileStream返回null –