for ftp mac乱码_FTPClient彻底解决乱码问题

这篇博客介绍了如何在Java中使用FTPClient处理FTP连接和文件操作时遇到的Mac系统乱码问题。通过发送UTF8选项命令并根据响应判断服务器编码,确保正确转换目录和文件名的编码,从而避免乱码。示例代码展示了如何创建FTPClient实例,切换工作目录,获取文件列表,读取文件内容,并最终断开连接。
摘要由CSDN通过智能技术生成

java-FTP工具

实际开发过程中,我们可能会有面向FTP的业务需求,这个时候,我们就会考虑如何与FTP服务器建立连接,如何

读取FTP服务器上文件内容,如何上传文件至FTP服务器等。apache为我们提供了一套解决方案。我们可以使用

commons-net包下提供的相关内容实现业务需求。maven导包如下:

commons-net

commons-net

3.1

FTPClient乱码问题

在实际开发过程中,大家或多或少都会遇到乱码问题,可能因为乱码进入不了指定的FTP目录,也可能因为乱码

不能正确读取到FTP文件内容。因为,国内主流使用的编码只有2种,GBK和UTF-8,这里我们可以编写一个FTP工具类。

具体代码如下:

import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPFile;

import org.apache.commons.net.ftp.FTPReply;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.text.SimpleDateFormat;

public class FTPUtil {

//检查ftp服务器是否是utf8编码

private static boolean is_utf8;

public static FTPClient getFTPClient(String ftpHost, Integer ftpPort, String ftpUserName, String ftpPassword) {

FTPClient ftpClient = null;

try {

ftpClient = new FTPClient();

ftpClient.setConnectTimeout(60000);

if (ftpPort != null) {

ftpClient.connect(ftpHost, ftpPort);

} else {

ftpClient.connect(ftpHost);

}

if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {

if (ftpClient.login(ftpUserName, ftpPassword)) {

//判断FTP服务器是UTF8编码还是GBK编码

if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(

"OPTS UTF8", "ON"))) {

is_utf8 = true;

}

ftpClient.enterLocalPassiveMode();

ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

ftpClient.enterLocalPassiveMode();

}

}

} catch (Exception e) {

e.printStackTrace();

}

return ftpClient;

}

public static void getFTPFile(FTPClient ftpClient, String path, String fileName) {

try {

boolean check_work;

if (is_utf8) {

check_work = ftpClient.changeWorkingDirectory(new String(path.getBytes("UTF-8"), "iso-8859-1"));

} else {

check_work = ftpClient.changeWorkingDirectory(new String(path.getBytes("GBK"), "iso-8859-1"));

}

if (check_work) {

FTPFile[] files = ftpClient.listFiles();

if (files.length > 0) {

String ftpFileName;

String lastModifyTime;

InputStream in;

BufferedReader br;

for (FTPFile ftpFile : files) {

//获取FTP服务器文件名

if (is_utf8) {

ftpFileName = new String(ftpFile.getName().getBytes("iso-8859-1"), "UTF-8");

} else {

ftpFileName = new String(ftpFile.getName().getBytes("iso-8859-1"), "GBK");

}

//获取FTP服务器文件最后修改时间

if (is_utf8) { //因为我们是+8区,utf8编码文件获取时间要加8小时

lastModifyTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(ftpFile.getTimestamp().getTimeInMillis() + ftpFile.getTimestamp().getTimeZone().getOffset(0));

} else {

lastModifyTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(ftpFile.getTimestamp().getTime());

}

}

//获取指定文件名的输入流

if (is_utf8) {

in = ftpClient.retrieveFileStream(new String(fileName.getBytes("UTF-8"), "iso-8859-1"));

} else {

in = ftpClient.retrieveFileStream(new String(fileName.getBytes("GBK"), "iso-8859-1"));

}

//解析文件内容

if (in != null) {

//这里也会有编码问题出现的可能--因为读取内容可能包含中文

br = new BufferedReader(new InputStreamReader(in, "gb2312"));

String data;

while ((data = br.readLine()) != null) {

System.out.println(data);

}

}

}

}

} catch (Exception e) {

e.printStackTrace();

} finally {

is_utf8 = false;

disConnection(ftpClient);

}

}

public static void disConnection(FTPClient ftpClient) {

try {

if (ftpClient.isConnected()) {

ftpClient.disconnect();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

用了一个开关来控制是UTF-8编码还是GBK编码。大体上就是上面所示代码了。

原文链接: https://marshucheng1.github.io/2017/03/13/ftpclient/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值