场景描述:
在系统中生成xml上传到指定目录中定时监控指定目录,读取目录中文件,解析,执行业务操作后,将文件移动到指定目录。废话没有,直接上代码。
1.上传
此处的处理没有生成文件后,将文件再上传,而是直接生成好xml格式字符串后, 转换为流上传。
// 设置编码ftpClient.setControlEncoding("UTF-8");ftpClient.enterLocalPassiveMode();// 创建目录, 如果目录已存在, 则返回false, 如果目录不存在就创建并返回trueboolean makeDirectory = ftpClient.makeDirectory(formatPathName(pathName)); for (Entry<String, InputStream> entry : map.entrySet()) {String fn = entry.getKey();InputStream fin = entry.getValue();// 执行上传result = ftpClient.storeFile(formatPathName(fn), fin);if (!result) {log.error(String.format("----FTP文件[%s]上传失败----", fn));return false;}}
上传时遇到的问题:
一开始ftpClient.setControlEncoding("UTF-8"); 编码设置的是GBK,上传也正常。用记事本打开xml文件中文也没有乱码,但是当用浏览器打开文件是就是乱码,无法预览,搞的很郁闷。因为没有乱码, 也没想到是这个地方编码的问题。然后各种搜,也没有找到跟我类似的问题, 但是看到有的例子里面用的是UTF-8, 我也就试着改了一下。然后,就可以了。
2.获取目录下所有文件夹名称
ftpClient.setControlEncoding("UTF-8");ftpClient.enterLocalPassiveMode();FTPFile[] ftpFiles = ftpClient.listFiles();List<String> retList = new ArrayList<String>();if (ftpFiles == null || ftpFiles.length == 0) {return retList;}for (FTPFile ftpFile : ftpFiles) {// 判断是否时目录if (ftpFile.isDirectory()) {retList.add(new String(ftpFile.getName().getBytes("UTF-8")));}}return retList;
此处问题同样是乱码问题,如代码中设置即可解决。
3.获取文件内容
ftpClient.setControlEncoding("UTF-8");ftpClient.enterLocalPassiveMode();FTPFile[] ftpFiles = ftpClient.listFiles(formatPathName(fileName));List<String> retList = new ArrayList<String>();if (ftpFiles == null || ftpFiles.length == 0) {return retList;}System.out.println("------------------ " + fileName + " 读取文件 开始 --------------------------");InputStream retrieveFileStream = ftpClient.retrieveFileStream(formatPathName(fileName));BufferedReader br = new BufferedReader(new InputStreamReader(retrieveFileStream, "GB2312"));// 构造一个BufferedReader类来读取文件String s = null;while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行retList.add(s);}br.close();retrieveFileStream.close();pletePendingCommand();System.out.println("------------------ " + fileName + " 读取文件 结束 --------------------------");return retList;
此处遇到问题:
1.获取文件内容是, 是乱码。经过多次尝试,new InputStreamReader(retrieveFileStream, "GB2312")要使用GB2312.2.循环获取文件按内容是, 第一个文件读取完成后就停止了, 并没有继续往下执行。查了一下是被阻塞,需添加pletePendingCommand();
4.移动文件, 删除文件、删除目录等操作失败, 多数也是因为中文名称乱码导致。此处不再多说。
名称处理的方法:
private String formatPathName(String str) throws UnsupportedEncodingException {// return new String(str.getBytes("GBK"), "iso-8859-1");return new String(str.getBytes("UTF-8"), "iso-8859-1");}
如果觉得《Java ftp 上传文件名乱码》对你有帮助,请点赞、收藏,并留下你的观点哦!