从Java应用程序到大型机数据集的FTP-带开/闭括号的问题
解决方案:除了按照Bruce Martin的回答将charset/codepage设置为cp037之外,我还必须更改FTP逻辑中的设置(使用apache commons net)。我必须将文件类型设置为EBCDIC。这里有一些示例代码来说明我在做什么从Java应用程序到大型机数据集的FTP-带开/闭括号的问题,java,character-encoding,ftp,mainframe,apache-commons-net,Java,Character Encoding,Ftp,Mainframe,Apache Commons Net,解决方案:除了按照Bruce Martin的回答将charset/codepage设置为cp037之外,我还必须更改FTP逻辑中的设置(使用apache commons net)。我必须将文件类型设置为EBCDIC。这里有一些示例代码来说明我在做什么 public FTPClient openFTPConnection() { String server = [server]; int port = [port]; int reply; FTPClient ftp
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<>();
}
public FTPClient openFTPConnection(){
字符串服务器=[server];
int port=[port];
int回复;
FTPClient FTPClient=新的FTPClient();
ftpClient.addProtocolCommandListener(新的PrintCommandListener(新的PrintWriter(System.out)));
试一试{
ftpClient.connect(服务器、端口);
reply=ftpClient.getReplyCode();
System.out.println(回复);
如果(!FTPReply.isPositiveCompletion(回复)){
System.out.println(回复);
ftpClient.disconnect();
抛出新异常(“连接到FTP服务器时出现异常”);
}
ftpClient.login(用户,通过);
ftpClient.setFileType(FTP.EBCDIC\u文件类型);
//以前,这被设置为FTP.ASCII_FILE_类型
ftpClient.enterLocalPassiveMode();
}捕获(例外e){
System.out.println(“错误:+e.getMessage());
e、 printStackTrace();
}
返回ftpClient;
}
公共列表ftpStoreAuthData(FTP客户端FTP客户端){
试一试{
字符串mainframeDataSet=[dataset];
InputStream stream=ftpClient.retrieveFileStream(mainframeDataSet);
trace(“检索大型机数据集…”);
BufferedReader=新的BufferedReader(新的InputStreamReader(流,“cp037”));
//在此之前,它被设置为“utf-8”
trace(“检索到的数据集!”);
字符串数据集文本;
而((datasetText=reader.readLine())!=null){
//处理数据集记录
}
返回新的ArrayList();
}
我正在用Java开发一个REST应用程序。我的一个REST端点向大型机发出FTP请求,并检索其中包含“[”和“]”字符的数据集
我尝试过使用ApacheCommonsNet和Spring的sftpsessionfactory FTP库�s、 当我从检索的数据集中读取每条记录时,会有一个if条件检查某个特定记录是否包含“[”或“]”字符,显然它失败了
作为一种黑客,我更改了if条件,以便它检查�这是一个很好的解决方法。这种解决方法的问题是,当我最终将数据集FTPing回大型机时,它最终会成为一个问题。我会覆盖�,但当文件到达大型机时,左括号显示为“Ý”,右括号显示为“;”。我在大型机上使用“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流/将数组字节转换为文本是的,代码页问题。什么以十六进制代码开始,并给出“[”最后是一个十六进制代码,它给出了其他一些东西。是的,ftp代码。谢谢!我会将此标记为正确答案,但在我的ftp代码中还有一个配置我也必须这样做。在将inputstream的字符集/代码页设置为cp037的基础上,我必须将ftp传输模式设置为EBCDIC_FILE_TYPE。我已经更新了我的问题,以显示代码fIBM-1140、IBM-1141与cp037(美国EBCDIC)、cp273(德国EBCDIC)相似,但带有欧元字符。如果数据包含欧元字符,这将非常有用。