PDA

View Full Version : Java Spooldatei auslesen



apparat
18-10-05, 10:10
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?

Nili
18-10-05, 22:06
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!

Fuerchau
19-10-05, 08:39
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.

apparat
19-10-05, 09:01
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.

Nili
19-10-05, 12:56
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.


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) {
}

apparat
19-10-05, 14:02
ä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

Nili
19-10-05, 14:13
Hi!

Sollte funktionieren. Auf Konsole sollte der Spool erscheinen.



try {
PrintParameterList printParms = new PrintParameterList();
printParms.setParameter(PrintObject.ATTR_WORKSTATI ON_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();
}

apparat
19-10-05, 14:26
hallo. vielen dank für den code. werd ihn mal bei mir einbauen und prüfen ob es denn auch funktioniert. melde mich dann.

apparat
19-10-05, 14:44
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....

Nili
19-10-05, 14:52
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.