场景描述:
- 在系统中生成xml上传到指定目录中
- 定时监控指定目录,读取目录中文件,解析,执行业务操作后,将文件移动到指定目录。
废话没有,直接上代码。
1.上传
此处的处理没有生成文件后,将文件再上传,而是直接生成好xml格式字符串后, 转换为流上传。
// 设置编码
ftpClient.setControlEncoding("UTF-8");
ftpClient.enterLocalPassiveMode();
// 创建目录, 如果目录已存在, 则返回false, 如果目录不存在就创建并返回true
boolean 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();
ftpClient.completePendingCommand();
System.out.println("------------------ " + fileName + " 读取文件 结束 --------------------------");
return retList;
此处遇到问题:
- 1.获取文件内容是, 是乱码。经过多次尝试, new InputStreamReader(retrieveFileStream, "GB2312")要使用GB2312.
- 2.循环获取文件按内容是, 第一个文件读取完成后就停止了, 并没有继续往下执行。查了一下是被阻塞,需添加 ftpClient.completePendingCommand();
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");
}