解決調(diào)用ftpClient.retrieveFileStream(String?remoteFilePath)第二次讀取為空問題
描述:當(dāng)讀取一個(gè)文件夾時(shí),文件夾中又存在多個(gè)文件,循環(huán)讀取時(shí),第一次調(diào)用
InputStream inputStream = ftpClient.retrieveFileStream(String remoteFilePath)可以讀出數(shù)據(jù),當(dāng)再次調(diào)用時(shí),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連接端口號(hào)是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對(duì)象
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();
//將文件值轉(zhuǎn)為二進(jìn)制數(shù)據(jù)
byte[] bytesArray = new byte[available];
inputStream.read(bytesArray);
//插入到數(shù)據(jù)庫(kù)中,代碼未體現(xiàn)
inputStream.close();
//ftpClient.getReply();
//調(diào)用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;
}解決方案:
調(diào)用ftpClient.completePendingCommand(); <strong>注意:</strong>FTP Server只有在接受到InputStream?執(zhí)行close方法時(shí),才會(huì)返回。所以一定先要執(zhí)行close方法。不然在第一次下載一個(gè)文件成功之后,之后再次獲取inputStream 就會(huì)返回null
存在問題:使用inputStream.available();進(jìn)行讀取數(shù)據(jù)時(shí),由于時(shí)網(wǎng)絡(luò)傳輸,可能會(huì)導(dǎo)致數(shù)據(jù)的丟失,讀取的數(shù)據(jù)長(zhǎng)度也會(huì)有限制,后續(xù)做改正.........
到此這篇關(guān)于解決調(diào)用ftpClient.retrieveFileStream(String remoteFilePath)第二次讀取為空問題的文章就介紹到這了,更多相關(guān)ftpClient.retrieveFileStream(String remoteFilePath)讀取為空內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何更優(yōu)雅的關(guān)閉java文本、網(wǎng)絡(luò)等資源
這篇文章主要介紹了如何更優(yōu)雅的關(guān)閉java文本、網(wǎng)絡(luò)等資源,在 finally 的關(guān)閉代碼中,還要再來一個(gè) try/catch,看著是不是很難受,很不優(yōu)雅,很想干掉這個(gè) finally!,需要的朋友可以參考下2019-06-06
Java利用Apache POI實(shí)現(xiàn)Excel文件讀寫操作
Apache POI是一個(gè)用于讀寫Microsoft Office文件格式的Java庫(kù),可以用來讀取或?qū)懭隕xcel文件,下面小編就和大家詳細(xì)講講Java借助Apache POI讀寫Excel的詳細(xì)代碼吧2026-02-02
Java基礎(chǔ)知識(shí)精通注釋與數(shù)據(jù)類型及常量與變量
本文給大家介紹了Java的注釋與數(shù)據(jù)類型和常量變量,這些都是最基礎(chǔ)的知識(shí),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
Windows下Java+MyBatis框架+MySQL的開發(fā)環(huán)境搭建教程
這篇文章主要介紹了Windows下Java+MyBatis框架+MySQL的開發(fā)環(huán)境搭建教程,Mybatis對(duì)普通SQL語(yǔ)句的支持非常好,需要的朋友可以參考下2016-04-04
mybatis-plus多表聯(lián)查join的實(shí)現(xiàn)
本文主要介紹了mybatis-plus多表聯(lián)查join的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
解決MyEclipse中Maven設(shè)置jdk版本jdk1.8報(bào)錯(cuò)問題
今天安裝了jdk1.8、tomcat8、和maven3.5.2,弄好后在myeclipse新建了一個(gè)maven項(xiàng)目,項(xiàng)目默認(rèn)是jdk1.5,改成jdk1.8后項(xiàng)目報(bào)錯(cuò)2018-10-10
java讀取圖片并轉(zhuǎn)化為二進(jìn)制字符串的實(shí)現(xiàn)方法
這篇文章主要介紹了java讀取圖片并轉(zhuǎn)化為二進(jìn)制字符串的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
SpringBoot+Docker+K8s云原生部署全流程(從零到發(fā)布)
本文詳解了SpringBoot項(xiàng)目從開發(fā)到基于Docker容器化,再通過K8s實(shí)現(xiàn)云原生部署的全流程,涵蓋環(huán)境搭建、鏡像構(gòu)建、服務(wù)部署及CI/CD自動(dòng)化,提升應(yīng)用部署效率與可維護(hù)性,需要的朋友跟隨小編一起學(xué)習(xí)吧2025-08-08

