2014-03-12 49 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 –