Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage |
<< | < | > | >> | API | Kapitel 26 - Drucken |
Sollten die in den vorangegangenen Abschnitten vorgestellten Drucktechniken nicht funktionieren oder auf Grund praktischer Schwierigkeiten nicht einsetzbar sein, gibt es eine Reihe anderer Möglichkeiten, Daten unter Java auszudrucken. Die aufwendigste und flexibelste von ihnen besteht darin, die Druckdaten selbst aufzubereiten und direkt an die serielle oder parallele Schnittstelle zu senden, an der der Drucker angeschlossen ist. Wir wollen in diesem Abschnitt kurz skizzieren, wie das mit Hilfe des Java Communications API durchgeführt werden kann.
Vor Einsatz dieser Technik sollten ihre Nachteile bedacht werden. Einerseits ist der Aufwand unter Umständen sehr groß, denn die Anwendung muß alle Low-Level-Details der Druckeransteuerung selbst implementieren. Das umfaßt die Auswahl und Belegung der Schnittstelle ebenso wie das Generieren der druckerabhängigen Steuersequenzen. Zweitens ist das Verfahren nicht sonderlich portabel. Zwar gibt es das Communication API als JDK-Standarderweiterung sowohl für SOLARIS als auch für Windows, auf anderen Systemen steht es aber unter Umständen nicht zur Verfügung. Auch Drucker, die nicht über die serielle oder paralle Schnittstelle angesteuert werden (z.B. USB- oder Netzwerkdrucker), können auf diese Weise naturgemäß nicht angesteuert werden. |
|
Das Java Communications API ist eine Standarderweiterung des JDK und recht einfach zu installieren. Es kann von http://java.sun.com/products/javacomm/index.html heruntergeladen oder der CD-ROM zum Buch entnommen werden. Bei vorhandenem JDK 1.4 sieht die Installation wie folgt aus:
Für das JDK 1.4 ist die Installation des Communications APIs nun abgeschlossen. Bei einem anderen JDK oder auf einem anderen Betriebssystem ist unter Umständen anders vorzugehen. Weitere Informationen können der Datei Readme.html entnommen werden.
Das Communications API liegt im Paket javax.comm. Die Klasse CommPortIdentifier dient zur Beschreibung von Kommunikationsports. Sie besitzt eine statische Methode getPortIdentifiers, mit der eine Enumeration von CommPortIdentifier-Objekten erzeugt werden kann, die ein Element je verfügbarem Port enthält. Zusätzlich kann mit der statischen Methode getPortIdentifier auch direkt auf einen namentlich bekannten Port zugegriffen werden:
public static Enumeration getPortIdentifiers() public static CommPortIdentifier getPortIdentifier(String portName) throws NoSuchPortException |
javax.comm.CommPortIdentifier |
Wurde ein CommPortIdentifier beschafft, können seine Eigenschaften abgefragt werden:
public String getName() public int getPortType() |
javax.comm.CommPortIdentifier |
getName liefert den Namen des Ports (z.B. "COM1" oder "LPT1" unter Windows, "/dev/..." unter UNIX). getPortType gibt entweder PORT_PARALLEL oder PORT_SERIAL zurück, je nachdem, ob es sich um eine parallele oder serielle Schnittstelle handelt.
Soll über einen Port kommuniziert werden, muß sein zugehöriger CommPortIdentifier durch Aufruf von open geöffnet werden:
public synchronized CommPort open(String appname, int timeout) throws PortInUseException |
javax.comm.CommPortIdentifier |
Die beiden Parameter geben den Namen der zu verwendenden Applikation und die maximale Zeitspanne, die beim Öffnen gewartet wird, an. Der Rückgabewert von open ist vom typ CommPort und kann in eine der (daraus abgeleiteten) Klassen ParallelPort oder SerialPort umgewandelt werden.
Die wichtigsten Methoden von CommPort sind getInputStream und getOutputStream. Sie beschaffen die zum Lesen bzw. Schreiben von Daten verwendeten Streams:
public InputStream getInputStream() throws IOException public OutputStream getOutputStream() throws IOException |
javax.comm.CommPort |
Darüber hinaus stellen CommPort und die daraus abgeleiteten Klassen einige Methoden zur Verfügung, mit denen Kommunikationsparameter eingestellt, Puffergrößen geändert oder Portzustände abgefragt werden können. Zudem bieten beide Klassen die Möglichkeit, Event-Listener zu registrieren, die bei Zustandsänderungen oder eingehenden Daten automatisch benachrichtigt werden. Wir wollen auf all diese Möglichkeiten nicht weiter eingehen; sie werden in der Dokumentation ausführlich beschrieben.
Zum Abschluß dieses Abschnitts soll ein einfaches Beispielprogramm gezeigt werden, das über die parallele Schnittstelle Daten an einen Drucker schickt. Es durchsucht zunächst die Liste aller Schnittstellen nach einem Parallelport mit dem Namen "LPT1" (unter UNIX müßte dieser Name entsprechend angepaßt werden). Dieser wird geöffnet, und mit getOutputStream ein OutputStream zum Schreiben von Daten beschafft. Nun gibt das Programm fünfzig Zeilen lang Teilstrings von "Hello LPT1 World" aus und sendet dann das Seitenendezeichen "\f" an den Drucker. Zum Schluß werden Ausgabestream und Port geschlossen und das Programm beendet.
001 /* Listing2604.java */ 002 003 import java.util.*; 004 import java.io.*; 005 import javax.comm.*; 006 007 public class Listing2604 008 { 009 public static void printHello(Writer out) 010 throws IOException 011 { 012 String s = "Hello LPT1 World"; 013 s += " " + s + " " + s; 014 for (int i = 1; i <= 50; ++i) { 015 out.write(s.substring(0, i) + "\r\n"); 016 } 017 out.write("\f"); 018 } 019 020 public static void main(String[] args) 021 { 022 Enumeration en = CommPortIdentifier.getPortIdentifiers(); 023 while (en.hasMoreElements()) { 024 CommPortIdentifier cpi = (CommPortIdentifier)en.nextElement(); 025 if (cpi.getPortType() == CommPortIdentifier.PORT_PARALLEL) { 026 if (cpi.getName().equals("LPT1")) { 027 try { 028 ParallelPort lpt1 = (ParallelPort)cpi.open( 029 "LPT1Test", 030 1000 031 ); 032 OutputStreamWriter out = new OutputStreamWriter( 033 lpt1.getOutputStream() 034 ); 035 printHello(out); 036 out.close(); 037 lpt1.close(); 038 System.exit(0); 039 } catch (PortInUseException e) { 040 System.err.println(e.toString()); 041 System.exit(1); 042 } catch (IOException e) { 043 System.err.println(e.toString()); 044 System.exit(1); 045 } 046 } 047 } 048 } 049 } 050 } |
Listing2604.java |
Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0.1 |
<< | < | > | >> | API | © 1998-2003 Guido Krüger, http://www.javabuch.de |