在 Java 中从 FTP 服务器上传文件
使用 Apache Commons Net API,可以很容易地编写一个程序,以便从FTP服务器下载文件。在本文中,您将学习如何正确实现 java 代码以通过 FTP.
Apache Commons Net API 和 FTP
org.apache.commons.net.ftp.FTPClient提供了两种从FTP服务器下载文件的方法:
1) boolean retrieveFile(String remote, OutputStream local):此方法通过在参数 remote,并使用 OutputStream。此方法返回 true如果成功,否则 false。当您不需要知道有关传输的信息以及如何将文件保存到磁盘时,此方法适用于我们的程序。在下载结束时,我们必须关闭输出流 OutputStream 在下载的末尾.
2) InputStream retrieveFileStream(String remote):此方法仅将远程文件路径作为参数,不需要 OutputStream,但它返回 InputStream这对于读取从文件接收的字节很有用。这种方法使我们能够更好地控制字节写入本地磁盘的方式。使用此方法有两个要点:
- completePendingCommand() 才能完成下载,并检查返回的值以查看下载是否已发生。
- 播放流必须关闭 InputStream.
问题是应该使用哪种方法?这里有一些技巧:
- 第一种方法是通过传递参数 OutputStream 我们要保存到 disk.
- 第二种方法让我们可以更好地控制传输的完成方式,因此需要通过创建 InputStream读取接收到的字节和 输出流 以保存读取的字节数。如果您想知道已传输了多少字节以及还剩下多少字节,此方法非常有用。方法 completePendingCommand() 必须调用
- 两种方法都会引发异常 IOException 或以下两个之一例外:FTPConnectionClosedExcception 和 CopyStreamException。因此,请确保在调用 .
此外,必须在 methods retrieveFile() 和 retrieveFileStream():
- void enterLocalPassiveMode():此方法将连接模式从服务器到客户端更改为客户端到服务器,从而避免了防火墙禁令问题。
- void setFileType(int fileType):此方法会更改要传输的文件类型,建议将类型更改为 FTP。BINARY_FILE_TYPE,而不是 FTP。ASCII_FILE_TYPE即使它是一个文本文件.
在 Java
以下是使用 Apache Commons Net:
- 连接并登录服务器。
- 使用被动连接模式。
- 将传输类型更改为binary.
- 创建outputStream 将下载的文件保存到 disk.
- 指定录制路径到 disk.
- 如果使用 retriveFile():
- Pass outputStream 和文件路径作为参数.
- 关闭写入流 outputStream.
- 读取返回的值以检查下载是否成功。
- 如果使用 retriveFileStream():
- 检索时间 InputStream 返回方法 retriveFileStream().
- 创建一个设置大小(通常为 4096)的字节数组(缓冲区)来读取字节并使用 a outputStream.
- 调用方法 completePendingCommand() 完成下载并检查返回值,查看传输是否成功。
- 关闭读写流 InputStream 和outputStream.
- 断开与服务器的连接,disconnect().
用于在 Java
此代码显示了如何使用以下两种方法从 FTP 服务器下载文件:- boolean retrieveFile(String remote, InputStream local)
- inputStream retrieveFileStream(String remote)
import java.io.BufferedOutputStream;执行此代码表示下载成功:
导入 java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
导入org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
public class FTPDownloadFile {
public static void main(String[] args) {
Server String = ServerAddress”;
int 端口 = 21;
字符串 username = YourUserName”;
字符串密码 = yourPassword”;
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(server, port);
ftpClient.login(用户名、密码);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// 方法一:使用 InputStream
File file = new File(plugins and styles.txt”);
String FileName = 插件和styles.txt”;
InputStream inputStream = new FileInputStream(file);
System.out.println(开始下载”);
//下载结果
boolean res = ftpClient.storeFile(filename, inputStream);
//关闭播放流
inputStream.close();
if (res==true) {
System.out.println(文件”+FileName+
已成功下载”);
}
// 方法二:使用 OutputStream
String 上传文件 FileName2 = Track 2.mp3”;
字符串 RemoteFilePath = /songs/”+FileName2;
文件 filelocal = new File(C:/Track 2.mp3”);
// 列出文件所在的文件夹 and
// 然后用名字搜索它以获得
// 它的大小,用于计算
// download
FTPFile[] files1 = ftpClient.listFiles(/songs”);
long size = 0;
for(int i = 0;我<文件1.长度;i++){
if(files1[i].getName().equals(FileName2))
//获取文件大小
size = files1[i].getSize();
}
OutputStream outputStream2 = new BufferedOutputStream(
new FileOutputStream(local file));
InputStream inputStream2 = ftpClient.retrieveFileStream(
RemoteFilePath);
byte[] bytesArray = 新字节[4096];
int bytesRead = -1;
//只要我们还没有到达终点
int transfer = 0;
int 百分比 = 0;
while ((bytesRead = inputStream2.read(bytesArray)) != -1) {
//字节写入指定位置
outputStream2.write(bytesArray, 0, bytesRead);
转发 += bytesRead;
percent = (int) (transferred*100/size);
System.out.println(百分比+%”);
}
//close write read streams
inputStream2.close();
outputStream2.close();
//br //
res = ftpClient.completePendingCommand();
if (res) {
System.out.println(文件”+FileName2+
已成功下载”);
}
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
try {
if (ftpClient.isConnected()) {
//close FTP
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
开始下载
插件和styles.txt文件已下载成功
开始下载
1%
2%
3%
.
.
98%
99%
99%
100%
2.mp3 Track file 已成功下载