Java是一種流行的編程語言,常用于開發(fā)各種應(yīng)用程序。在Java中,操作FTP服務(wù)器以上傳和下載文件是一項常見的任務(wù)。然而,從FTP服務(wù)器下載或上傳的文件大小為0k的問題經(jīng)常會遇到。這個問題可能由多種因素導(dǎo)致,這篇文章將介紹如何解決Java調(diào)用FTP上傳和下載為0k的問題。
首先,我們需要了解Java程序中用于FTP讀寫的類庫,常用的有apache.commons.net.ftp.*和sun.net.ftp.*兩個包。其中,apache.commons.net.ftp.*包提供了更多的功能,相對而言更穩(wěn)定,推薦使用。
接下來,我們需要注意一些文件傳輸過程可能出現(xiàn)的問題。
1. 上傳的文件大小為0
FTPClient ftp = new FTPClient(); ftp.connect(ip, port); ftp.login(username, password); File file = new File(localPath); FileInputStream input = new FileInputStream(file); ftp.storeFile(remotePath, input);
上述代碼漏掉了一行:
ftp.enterLocalPassiveMode();
因為FTP默認使用主動模式(即服務(wù)器向客戶端發(fā)起連接),而有些防火墻會拒絕此類連接,因此需要使用被動模式(客戶端向服務(wù)器發(fā)起連接)。
2. 下載的文件大小為0
FTPClient ftp = new FTPClient(); ftp.connect(ip, port); ftp.login(username, password); FileOutputStream output = new FileOutputStream(localPath); ftp.retrieveFile(remotePath, output);
為解決這個問題,我們可以把retrieveFile換成retrieveFileStream,然后手動讀取,再寫入文件。
FTPClient ftp = new FTPClient(); ftp.connect(ip, port); ftp.login(username, password); OutputStream output = new FileOutputStream(localPath); InputStream input = ftp.retrieveFileStream(remotePath); byte[] buffer = new byte[1024]; int len = 0; while ((len = input.read(buffer)) != -1) { output.write(buffer, 0, len); } input.close(); output.close(); ftp.completePendingCommand();
綜上所述,要解決Java調(diào)用FTP上傳和下載為0k的問題,我們需要讓程序進入被動模式,同時手動讀取并寫入文件。我們需要注意的是,F(xiàn)TP連接的穩(wěn)定性和防火墻設(shè)置等因素也可能會影響文件傳輸?shù)慕Y(jié)果。