解決調用ftpClient.retrieveFileStream(String?remoteFilePath)第二次讀取為空問題
描述:當讀取一個文件夾時,文件夾中又存在多個文件,循環(huán)讀取時,第一次調用
InputStream inputStream = ftpClient.retrieveFileStream(String remoteFilePath)可以讀出數據,當再次調用時,inputStream = null;
解決方法:在執(zhí)行完inputStream.close();方法之后,執(zhí)行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();
}
//創(chuàng)建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()解決第二次讀取為空情況
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;
}解決方案:
調用ftpClient.completePendingCommand(); <strong>注意:</strong>FTP Server只有在接受到InputStream?執(zhí)行close方法時,才會返回。所以一定先要執(zhí)行close方法。不然在第一次下載一個文件成功之后,之后再次獲取inputStream 就會返回null
存在問題:使用inputStream.available();進行讀取數據時,由于時網絡傳輸,可能會導致數據的丟失,讀取的數據長度也會有限制,后續(xù)做改正.........
到此這篇關于解決調用ftpClient.retrieveFileStream(String remoteFilePath)第二次讀取為空問題的文章就介紹到這了,更多相關ftpClient.retrieveFileStream(String remoteFilePath)讀取為空內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mybatis-Plus使用p6spy對SQL性能進行監(jiān)控的方法
這篇文章主要介紹了Mybatis-Plus使用p6spy對SQL性能進行監(jiān)控的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
Spring boot+mybatis+thymeleaf 實現登錄注冊增刪改查功能的示例代碼
這篇文章主要介紹了Spring boot+mybatis+thymeleaf 實現登錄注冊增刪改查功能的示例代碼,本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07

