當使用jsch設置編碼格式時
sftp.setFilenameEncoding("GBK");
出現如下錯誤:The encoding can not be changed for this sftp server。
使用的jar包是:jsch-0.1.54,經查看源碼發現,版本是3-5的,都不支持設置文件名編碼格式。
public void setFilenameEncoding(String encoding) throws SftpException{
int sversion=getServerVersion();
if(3 <= sversion && sversion <= 5 &&
!encoding.equals(UTF8)){
throw new SftpException(SSH_FX_FAILURE,
"The encoding can not be changed for this sftp server.");
}
if(encoding.equals(UTF8)){
encoding=UTF8;
}
fEncoding=encoding;
fEncoding_is_utf8=fEncoding.equals(UTF8);
}
解決方式:使用反射修改server_version的默認值即可。
JSch jsch = new JSch();
jsch.addIdentity("provateKey");
Session session = jsch.getSession("userName", "serverIp",“port”);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
ChannelSftp channelSftp = (ChannelSftp)session.openChannel("sftp");
channelSftp.connect();
Class cl = channelSftp.class;
Field f1 =cl.getDeclaredField("server_version");
f1.setAccessible(true);
f1.set(sftp, 2);
channelSftp.setFilenameEncoding("gbk");
其中Field是引用java.lang.reflect.Field jar包裏面的類。
這樣就ok了,如果想知道自己使用的jar版本是多少,可以使用getServerVersion方法來獲取。具體方法如下:
channelSftp.getServerVersion().