LÖSUNG: Zusätzlich zu der Einstellung von Zeichensatz/Codepage zu cp037, wie von Bruce Martins Antwort angegeben, musste ich auch eine Einstellung in meiner FTP-Logik ändern Apache commons net). Ich musste den Dateityp auf EBCDIC einstellen. Hier ist ein Beispielcode, um zu zeigen, was ich gemacht habe.FTP von der Java-Anwendung zum Mainframe-Datensatz - Problem mit öffnenden/schließenden Klammern
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<>();
}
Ich entwickle eine REST-Anwendung in Java. Einer meiner REST-Endpunkte erstellt eine FTP-Anfrage an den Mainframe und ruft einen Datensatz mit den Zeichen '['] und '' ab.
Ich habe versucht mit Apache Commons Net und Spring sftpsitzacefactory FTP-Bibliotheken. In beiden Fällen werden die öffnenden/schließenden Klammerzeichen an meine Anwendung als s zurückgegeben. Während ich in jedem Datensatz aus dem Datensatz lese, den ich abrufe, gibt es eine if-Bedingung, die prüft, ob ein bestimmter Datensatz '['] oder '' '- Zeichen enthält und offensichtlich fehlschlägt.
Als eine Art Hack habe ich die if-Bedingung so geändert, dass sie stattdessen nach s sucht. Dies funktioniert und ist eine schnelle Lösung. Das Problem mit dieser Problemumgehung besteht darin, dass es zu einem Problem wird, wenn ich die Datenmenge zurück auf den Mainframe übertrage. Ich überschreibe die s mit '[]' s, aber wenn die Datei den Mainframe trifft, erscheint die offene Klammer als '' 'und die Klammer erscheint als' ¨ '. Ich benutze den "HEX ON" -Befehl auf dem Mainframe, um zu sehen, wie groß der Unterschied zwischen den erforderlichen öffnenden/schließenden Klammern und den offenen/geschlossenen Klammern ist, die ich sende.
Die offene Klammer, die ich sende (Ý), hat den Hexadezimalwert AD. Die offene Klammer, die das Dataset benötigt, hat den Hexadezimalwert BA.
Die schließende Klammer, die ich sende (¨) hat Hexadezimalwert BD. Die schließende Klammer, die das Dataset benötigt, hat den Hexadezimalwert BB.
Wie kann ich die Klammern schreiben, um den hex Wert zu entsprechen, der vom Datensatz benötigt wird? Wie kann ich es auch so machen, dass die Klammern nicht als s erscheinen, wenn ich das Dataset abrufe? Ich habe gehört, dass das Problem etwas mit verschiedenen Codierungen von EBCDIC-Codepages zu tun hat, was großartig ist, aber ich bin mir nicht sicher, wie ich das beheben soll.
Lassen Sie mich wissen, wenn Sie meinen FTP-Code sehen müssen. Ich kann es bei Bedarf posten.
Ja, Codepage Ausgabe in Text-Bytes. Was mit einem Hex-Code beginnt, der "[" ergibt, endet mit einem Hex-Code, der etwas anderes ergibt. Ja, FTP-Code. –