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

您所在的位置:网站首页 ftp上查看文件内容 通过JAVA对FTP服务器连接,上传,下载,读取,移动文件等

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

2024-01-16 09:22| 来源: 网络整理| 查看: 265

记录一次对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,以上就是所有问题,有问题可以发邮件联系:[email protected]。 欢迎沟通交流。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3