解决方案:除了按照布鲁斯·马丁的回答将charset / codepage设置为cp037之外,我还必须更改FTP逻辑中的设置(使用apache commons net)。我必须将文件类型设置为EBCDIC。这是一些示例代码来显示我在做什么。
public FTPClient openFTPConnection() {
String server = [server];
int port = [port];
int reply;
FTPClient ftpClient = new FTPClient();
ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
try {
ftpClient.connect(server, port);
reply = ftpClient.getReplyCode();
System.out.println(reply);
if (!FTPReply.isPositiveCompletion(reply)) {
System.out.println(reply);
ftpClient.disconnect();
throw new Exception("Exception in connecting to FTP Server");
}
ftpClient.login(user, pass);
ftpClient.setFileType(FTP.EBCDIC_FILE_TYPE);
//Previously, this was set to FTP.ASCII_FILE_TYPE
ftpClient.enterLocalPassiveMode();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
e.printStackTrace();
}
return ftpClient;
}
public List ftpStoreAuthData(FTPClient ftpClient) {
try {
String mainframeDataSet = [dataset];
InputStream stream = ftpClient.retrieveFileStream(mainframeDataSet);
logger.trace("Retrieving mainframe data set...");
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "cp037"));
//Previously, this was set to "utf-8"
logger.trace("Data set Retrieved!");
String datasetText;
while((datasetText = reader.readLine()) != null) {
//do things with dataset records
}
return new ArrayList<>();
}
我正在用Java开发REST应用程序。我的REST端点之一向大型机发出FTP请求,并检索其中包含'['和']'字符的数据集。
我尝试使用Apache Commons Net和Spring的sftpsessionfactory FTP库。在这两种情况下,打开/关闭方括号字符都会作为返回给我的应用程序。当我从检索的数据集中读取每条记录时,有一个if条件检查特定记录是否包含'['或']'字符,并且显然失败。
作为一种技巧,我更改了if条件,以便改为检查``s''。这是可行的,是一种快速解决方案。这种解决方法的问题在于,当我最终将数据集通过FTP传输回大型机时,它最终成为一个问题。我用'[]'覆盖了s,但是当文件命中大型机时,右括号显示为'Ý',右括号显示为'¨。我在大型机上使用“ HEX ON”命令来查看所需的打开/关闭括号和我发送的打开/关闭括号之间的区别。
我要发送的左括号(Ý)的十六进制值为AD。数据集所需的开括号具有十六进制值BA。
我要发送的右括号(¨)的十六进制值为BD。数据集所需的右括号的值为十六进制BB。
如何编写括号以匹配数据集所需的十六进制值?另外,如何检索数据集时使括号不显示为?我听说这个问题与不同的EBCDIC代码页转换有关,这很好,但是我不确定如何解决该问题。
让我知道您是否需要查看我的FTP代码。如有必要,我可以发布它。
您可以使用适当的EBCDIC字符集IBM037 / CP037是美国EBCDIC。还有很多其他功能,例如在德国/奥地利使用cp273。
你可以做
Reader r = new InputStreamReader(in, "cp037");
String s = new String(bytes, "cp037");
// or for 3 spaces
String spaces = new String(new byte[] {40, 40, 40}, "cp037");
到读取EBCDIC流/转换数组字节以文本
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句