java ftp 文件移动文件_通过JAVA对FTP服务器连接,上传,下载,读取,移动文件等...

记录一次对FTP服务器文件内容

通过Java程序对FTP服务器文件处理:连接,上传,下载,读取,移动文件等。

需求描述:今天接到一个任务,在Java项目中,读取FTP服务器上的一些文件,进行一些业务操作。处理完之后,将读取过的文件移动到其他目录里面。这就是我需求。

记录一下使用过程:这里使用的是 org.apache.commons.net.ftp.FTP 这个FTP处理包。

碰到的几个你可能看这篇文章要解决的碰到的问题,提前说下解决方案:

完全不知道FTP的API如何使用,无从下手?(直接看方法就行了,很简单)

访问服务器的时候连接成功,但是使用ListFile()获取不到任何文件?(就是第三个问题描述的)

想要移动FTP服务器里的文件,如何办?(我使用了Rename操作来完成的。把原有的名字)

具体业务实现。(你自己厘清自己的实现思路,无论是读取指定文件夹的内容,还是上传或者下载,亦或者是对文件名处理,split拼接,判断指定类型等等。都不是什么难的操作。按照自己的需求,自己去设计实现吧。)

上传下载读取的话,都是使用流的操作。(看代码吧。)

聊一下关于修改FTP工作空间的操作和设置数据传输模式。(这个先简单的提供两行代码,可能就已经能够解决你的疑问了)

//修改工作目录: 就是说,你要处理哪里的文件什么的。看一下Doc就知道了。

ftpClient.changeWorkingDirectory(pathname);

//开启本地传输模式。(还有其他几种模式。Doc文档中有。自行查阅)

ftpClient.enterLocalPassiveMode();

我这里提炼出来了几个方法,新手使用的话,或者有问题的看代码自行参悟吧。比较简单,这里也主要就是对代码上的记录。(为了保护隐私,隐藏了一些隐私数据和业务处理类。)

关于代码,先说注意事项:

用完连接,记得关。

用完流,记得关。

有异常,记得处理。

下面是具体的代码:

建立FTP连接。

public FTPClient ftpClient = null;

//ftp服务器IP

public String hostname = "XXX10.1001.11";

//ftp服务器端口号默认为21

public Integer port = XXX;

//ftp登录账号

public String username = "XXX";

//ftp登录密码

public String password = "XXX";

public void initFtpClient() {

ftpClient = new FTPClient();

ftpClient.setControlEncoding("utf-8");

try {

System.out.println("connecting...ftp服务器:"+hostname+":"+port);

ftpClient.connect(hostname, port); //连接ftp服务器

ftpClient.login(username, password); //登录ftp服务器

int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器

if(!FTPReply.isPositiveCompletion(replyCode)){

System.out.println("connect failed...ftp服务器:"+hostname+":"+port);

}

System.out.println("connect successfu...ftp服务器:"+hostname+":"+port);

}catch (MalformedURLException e) {

e.printStackTrace();

}catch (IOException e) {

e.printStackTrace();

}

}

调用完 intFTPClient()方法之后,就可以使用ftpClient 来操作FTP服务器了。

上传.

/**

* 上传文件

* @param pathname ftp服务保存地址

* @param fileName 上传到ftp的文件名

* @param originfilename 待上传文件的名称(绝对地址) *

* @return*

**/

public boolean uploadFile( String pathname, String fileName,String originfilename){

boolean flag = false;

InputStream inputStream = null;

try{

System.out.println("开始上传文件");

inputStream = new FileInputStream(new File(originfilename));

initFtpClient();

ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);

CreateDirecroty(pathname);

ftpClient.makeDirectory(pathname);

ftpClient.changeWorkingDirectory(pathname);

ftpClient.enterLocalPassiveMode();

ftpClient.storeFile(fileName, inputStream);

inputStream.close();

ftpClient.logout();

flag = true;

System.out.println("上传文件成功");

}catch (Exception e) {

System.out.println("上传文件失败");

e.printStackTrace();

return false;

}finally{

if(ftpClient.isConnected()){

try{

ftpClient.disconnect();

}catch(IOException e){

e.printStackTrace();

flag = false;

}

}

if(null != inputStream){

try {

inputStream.close();

} catch (IOException e) {

e.printStackTrace();

flag = false;

}

}

}

return flag;

}

下载

//我这里在读到文件流的时候,没有保存到本地,直接在程序里面读取转换里面的内容,继续使用了。

//如果有需要的话,我简单的说下思路。就是 用 ftpClient调用指定文件下的文件,调用 FTPFile[] ftpFileArr = ftpClient.listFiles(path);

//后续 InputStream in = ftpClient.retrieveFileStream(fileName)。 获取到具体的文件流。然后后续操作 保存流到本地即可。

移动文件(通过Rename完成)

/**

*

* @param nameSet 需要移动的文件目录清单

* @param fromPath 从哪个目录移动

* @param toPath 要移动的目录(从根目录开始写。如:/code/yes/:根目录下的code目录下的yes目录

* @return 返回成功或者失败

* 注意:目录的话,以/结尾

*/

public boolean moveFile(List nameSet,String fromPath,String toPath){

//name格式:/code/yesdawaTest1.txt 、/code/yesdawaTest2.txt

if (nameSet != null && nameSet.size() > 0) {

for (String s : nameSet) {

try {

//获取连接:因为一次连接改多个文件只能有一个生效。这里每次修改文件的时候,获取一次新的链接

initFtpClient();

//改变工作目录

ftpClient.changeWorkingDirectory(fromPath);

ftpClient.enterLocalPassiveMode();

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

String[] split = s.split("/");

String name = "";

if (split.length > 0) {

name = split[split.length - 1];

}

boolean rename = ftpClient.rename(name, toPath + name);

if (rename) {

System.out.println(name + "成功移动到:" + toPath + name);

}

ftpClient.logout();

} catch (IOException e) {

e.printStackTrace();

return false;

}

}

}

return true;

}

对文件名或文件类型的处理和判断。(仅供参考)

//检查指定/path目录下,是否有.txt结尾的文件。如果有,返回符合要求的.

/**

*

* @param path:要查找的文件目录,如 /code:根目录下的code目录

* @param ext:要查找的文件类型扩展名,如 .txt

* @return 返回:符合查找要求的 文件名清单。

*

* 返回的 文件名清单:可以先用于处理数据,然后再处理数据成功后,移动这些文件到其他目录下。

*/

public List checkExistFile(String path, String ext){

//定义一个返回集合:

List tNameSet = new ArrayList<>();

//连接服务器

initFtpClient();

try {

//改变工作目录

ftpClient.changeWorkingDirectory(path);

ftpClient.enterLocalPassiveMode();

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

String[] strings = ftpClient.listNames(path);

if (strings.length > 0) {

for (String string : strings) {

//如果文件名的长度(带后缀名的)>4 . 才可能是 .txt 结尾的。

if (string.length() > ext.length()) {

//取得文件后缀名

String substring = string.substring(string.length() - ext.length());

if (ext.equals(substring)) {

System.out.println("目前正在处理文件:" + string);

tNameSet.add(string);

}

}

}

}

ftpClient.logout();

} catch (IOException e) {

System.out.println("读取:"+path+" 目录失败");

e.printStackTrace();

}

//返回:符合要求的文件 名字 清单

return tNameSet;

}

关闭ftp连接

/**

* 关闭FTP服务链接

* @throws IOException

*/

public static void disConnection(FTPClient ftpClient){

try {

if(ftpClient.isConnected()){

ftpClient.disconnect();

}

} catch (IOException e) {

e.printStackTrace();

}

OK,以上就是所有问题,有问题可以发邮件联系:16637462812@163.com。 欢迎沟通交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值