[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    51

    Post Java Spooldatei auslesen

    Ich hole mir mit einem Transformed Input Stream den Inhalt der Spooldatei in mein Java Programm. Das klappt auch ganz gut, aber es gibt Probleme bei den Umlauten. Dort werden andere Zeichen dargestellt.

    Hat jemand eine Idee von euch wie ich das umwandeln kann?

  2. #2
    Registriert seit
    Sep 2002
    Beiträge
    47
    Hi!

    Versuchs mal mit: com.ibm.as400.access.CharConverter

    Beispiel:
    CharConverter cnv = new CharConverter(<ccsid>);
    String s = cnv.byteArrayToString(<byte>,<offset>, <len>);
    usw.

    Der Stream ist in EBCDIC der muss erst nach UniCode!
    Ciao
    Nili

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Die Umwandlung von EBCDIC nach UNICODE klappt ja wohl, es betrifft nur die Umlaute bzw. Sonderzeichen.
    Dies liegt daran, dass die Spools keiner Codewandlung in eine CCSID mehr unterliegen. Spools werden von Programmen in der CCSID zur Laufzeit erstellt, so dass später keine Übersetzung mehr stattfinden darf, sonst käme bei den Druckern ja was falsches an.
    Daher klappt ein CPYSPLF ja nur in eine Datei per CCSID 65535 !

    Die Frage ist nun hier, wie du die Spool dann überhaupt ausliest ?
    Nimmst du dafür den Systembefehl CPYSLPF ?

    Du kannst eine Codeumsetzung nur erzwingen, wenn du z.B. auf der AS/400 folgendes machst:
    CPYSPLF in eine PF mit CCSID 65535.
    CPYF aus dieser PF in eine PF mit CCSID 273 (per DDS oder CREATE TABLE) ohne LVLCHK !
    Auslesen dieser Datei bzw. CPYTOIMPF/CPYTOSTMF ins IFS.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Sep 2005
    Beiträge
    51
    hallo.
    hier mal ein kleiner auszuf aus meinem quelltext:

    PrintObjectTransformedInputStream in = null;
    try {
    PrintParameterList printParms = new PrintParameterList();
    printParms.setParameter(PrintObject.ATTR_WORKSTATI ON_CUST_OBJECT, PLAIN_TEXT);
    printParms.setParameter(PrintObject.ATTR_MFGTYPE, "*WSCST");
    // get the text (via a transformed input stream) from the spooled file

    in = splf.getTransformedInputStream(printParms);

    byte buffer = new byte[8 * 1024];
    int count = 0;
    do {
    out.write(buffer, 0, count);
    count = in.read(buffer, 0, buffer.length);
    } while (count != -1);
    } finally {
    try {
    in.close();
    } catch (IOException e) {
    }






    wenn ich mir die spoolfile in eine datenbankdatei schreibe und dann per sql auslese geht es ja. aber ich wollte von dieser methode halt weg kommen, da es länger dauert das erst reinzuschreiben. java wird dort für einige sekunden blockiert wenn ich die spool in die datenbank schreibe.

  5. #5
    Registriert seit
    Sep 2002
    Beiträge
    47
    Hi!

    Bau mal Dein Programm etwas um auf:

    1. printParms.setParameter(PrintObject.ATTR_MFGTYPE, "*WSCST"); raus damit

    2. CharConverter nachbauen s. o.

    3. Steuerzeichen auswerten. Den ByteStream byte für
    byte durchgehen und z.B. 0x15 usw. auswerten.

    Mit der Methode funktioniert es auf jedenfall.

    Zitat Zitat von apparat
    hallo.
    hier mal ein kleiner auszuf aus meinem quelltext:

    PrintObjectTransformedInputStream in = null;
    try {
    PrintParameterList printParms = new PrintParameterList();
    printParms.setParameter(PrintObject.ATTR_WORKSTATI ON_CUST_OBJECT, PLAIN_TEXT);
    printParms.setParameter(PrintObject.ATTR_MFGTYPE, "*WSCST");
    // get the text (via a transformed input stream) from the spooled file

    in = splf.getTransformedInputStream(printParms);

    byte buffer = new byte[8 * 1024];
    int count = 0;
    do {
    out.write(buffer, 0, count);
    count = in.read(buffer, 0, buffer.length);
    } while (count != -1);
    } finally {
    try {
    in.close();
    } catch (IOException e) {
    }
    Ciao
    Nili

  6. #6
    Registriert seit
    Sep 2005
    Beiträge
    51
    äh hast du vielleicht ein beispiel gleich? also ne kleinen manipulation an meinem quelltext?

    das wär nämlich ganz gut da ich nicht genau weiß was du jetzt meinst

  7. #7
    Registriert seit
    Sep 2002
    Beiträge
    47
    Hi!

    Sollte funktionieren. Auf Konsole sollte der Spool erscheinen.

    Code:
    try {
    			PrintParameterList printParms = new PrintParameterList();
    			printParms.setParameter(PrintObject.ATTR_WORKSTATION_CUST_OBJECT,
    					"/QSYS.LIB/QWPDEFAULT.WSCST");
    			in = splf.getTransformedInputStream(printParms);
    
    			CharConverter cnv = new CharConverter(i5.getCcsid());
    
    			byte[] buffer = new byte[1024];
    			in.read(buffer, 0, buffer.length);
    			in.close();
    
    			byte[] line = new byte[255];
    			int len = 0;
    			for (int i = 0; i < buffer.length; i++) {
    
    				switch (buffer[i]) {
    
    					case 0x15:
    						System.out.println(cnv.byteArrayToString(line, 0, len));
    						line = new byte[255];
    						len = 0;
    						break;
    
    					case 0x00:
    						line[len] = 0x40;
    						len++;
    						break;
    
    					default:
    						line[len] = buffer[i];
    						len++;
    				}
    
    			}
    
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    Ciao
    Nili

  8. #8
    Registriert seit
    Sep 2005
    Beiträge
    51
    hallo. vielen dank für den code. werd ihn mal bei mir einbauen und prüfen ob es denn auch funktioniert. melde mich dann.

  9. #9
    Registriert seit
    Sep 2005
    Beiträge
    51
    es funktioniert soweit erstmal nur bekomme ich nun andere komische zeichen:
    hier mal ein vergleich was rauskommt und was rauskommen sollte:

    in java:
    ?ä?1400 F* bezogen auf das Tagesdatum wird der nächst-mögliche Liefertag ** 04.05.01
    ?ä?1500 F* (Arbeitstag) ermittelt, in dem das Datum um eine vorgegebene ** 04.05.01
    ?ä?1600 F* Anzahl (PARDAY) von Arbeitstagen erhöht wird. Wochenende ** 04.05.01


    auf as400:

    1400 F* bezogen auf das Tagesdatum wird der nächst-mögliche Liefertag **
    1500 F* (Arbeitstag) ermittelt, in dem das Datum um eine vorgegebene **
    1600 F* Anzahl (PARDAY) von Arbeitstagen erhöht wird. Wochenende **


    es geht dabei nur um die "?ä?" zeichen....

  10. #10
    Registriert seit
    Sep 2002
    Beiträge
    47
    Hi!

    Dat meinte ich mit Steuerzeichen.
    Dahinter verbirgt sich CR, LF, NL usw.
    Die musst Du noch auswerten oder im switch-Zweig abfangen
    und nicht mit andrucken.
    Ciao
    Nili

Similar Threads

  1. Java und Fehlermeldung jva0122 bei simplen "Hello World"
    By TARASIK in forum IBM i Hauptforum
    Antworten: 21
    Letzter Beitrag: 30-03-11, 13:48
  2. Teildateien mit sql auslesen
    By chrisssiie in forum NEWSboard Programmierung
    Antworten: 19
    Letzter Beitrag: 09-01-07, 10:53
  3. Java Version
    By Muchi in forum NEWSboard Java
    Antworten: 2
    Letzter Beitrag: 07-11-06, 11:00
  4. Antworten: 3
    Letzter Beitrag: 06-06-06, 15:57
  5. Excel auslesen mit Java über JDBC-ODBC Bridge
    By Deficiency in forum NEWSboard Java
    Antworten: 15
    Letzter Beitrag: 02-12-05, 09:18

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •