View Full Version : 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?
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!
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.
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.
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) {
}
ä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
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();
}
hallo. vielen dank für den code. werd ihn mal bei mir einbauen und prüfen ob es denn auch funktioniert. melde mich dann.
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....
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.