2016-04-26 11 views
1

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.

+0

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. –

Antwort

3

Sie können den entsprechenden EBCDIC-Zeichensatz IBM037/CP037 ist US-EBCDIC verwenden. Es gibt viele andere, z.B. cp273 wird in Deutschland/Österreich verwendet.

können Sie tun

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"); 

zu einen EBCDIC-Stream lesen/konvertieren ein Array

+0

Danke! Ich werde dies als die richtige Antwort markieren, aber es gab eine andere Konfiguration in meinem FTP-Code, die ich auch tun musste. Nachdem ich den Zeichensatz/Codepage des Eingabestreams auf cp037 gesetzt hatte, musste ich den FTP-Übertragungsmodus auf EBCDIC_FILE_TYPE setzen. Ich habe meine Frage aktualisiert, um den Code dafür anzuzeigen. – bscott

+1

IBM-1140, IBM-1141 sind ähnlich wie cp037 (US EBCDIC), cp273 (deutsch EBCDIC), aber mit Euro-Zeichen. Wenn die Daten Euro-Zeichen enthalten, wäre dies nützlich. – cobp