1. 程式人生 > 實用技巧 >01-呼叫ftpClient.retrieveFileStream(String remoteFilePath)第二次讀取為空

01-呼叫ftpClient.retrieveFileStream(String remoteFilePath)第二次讀取為空

描述:當讀取一個資料夾時,資料夾中又存在多個檔案,迴圈讀取時,第一次呼叫

InputStream inputStream = ftpClient.retrieveFileStream(String remoteFilePath)可以讀出資料,當再次呼叫時,inputStream = null;

解決方法:在執行完inputStream.close();方法之後,執行ftpClient.completePendingCommand();

程式碼:

public ResultData getFromFtpDataToDatabase(HttpServletRequest request){
        ResultData resultData 
= new ResultData(Result_Code.SUCCESS); String IP = Tools.processNull("***.***.***.***"); //ftp埠是21 使用WinSCP 採用的是SSH連線埠號是22 String PORT = Tools.processNull("21"); String userName= Tools.processNull("userName"); String passWord = Tools.processNull("passWord"); String directory
= Tools.processNull(""); String upload = Tools.processNull("/upload/"); String history = Tools.processNull("/history/"); String filepath = "/test/"; String paths = null; try { paths = new String(filepath.getBytes(),"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
//建立FTPClient物件 FTPClient ftpClient = new FTPClient(); try{ //解決資料夾有中文是讀不出檔案問題 ftpClient.setAutodetectUTF8(true); ftpClient.connect(IP, Integer.parseInt(PORT)); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setFileTransferMode(FTP.BLOCK_TRANSFER_MODE); ftpClient.login(userName, passWord); //讀取資料夾下檔案 FTPFile[] files = ftpClient.listFiles(paths); //獲取檔名稱 String saveAsFileName = null; for (int i = 0; i < files.length; i++) { saveAsFileName=files[i].getName(); //檔案路徑 String remoteFile = filepath+saveAsFileName; // get output stream of the response InputStream inputStream = ftpClient.retrieveFileStream(remoteFile);

int available = inputStream.available(); //將檔案值轉為二進位制資料 byte[] bytesArray = new byte[available]; inputStream.read(bytesArray); //插入到資料庫中 inputStream.close(); //ftpClient.getReply(); ftpClient.completePendingCommand(); } }catch (IOException ex) { ex.printStackTrace(); } finally { try { // 登出FTP客戶端 if(ftpClient!=null){ ftpClient.logout(); } } catch (Exception e) { // 如果FTP登出失敗什麼也不做,忽略掉異常。 } if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ex2) { ex2.printStackTrace(); } } } resultData.put("msg","操作成功"); return resultData; }

不足之處:使用inputStream.available();進行讀取資料時,由於時網路傳輸,可能會導致資料的丟失,讀取的資料長度也會有限制,後續做改正.........

後續問題:檔案移動,,刪除資料夾