Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 5. Auflage
 <<    <     >    >>   API  Kapitel 26 - Drucken

26.4 Zugriff auf serielle und parallele Schnittstellen



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 aufwändigste 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 muss alle Low-Level-Details der Druckeransteuerung selbst implementieren. Das umfasst 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.

 Warnung 

26.4.1 Das Java Communications API

Installation

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 DVD zum Buch entnommen werden. Bei vorhandener J2SE 6.0 sieht die Installation wie folgt aus:

Für die J2SE 6.0 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.

Prinzipielle Arbeitsweise

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, muss 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.

26.4.2 Ein einfaches Beispielprogramm

Zum Abschluss 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üsste dieser Name entsprechend angepasst 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
Listing 26.4: Druckausgabe an LPT1


 Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 5. Auflage, Addison Wesley, Version 5.0.2
 <<    <     >    >>   API  © 1998, 2007 Guido Krüger & Thomas Stark, http://www.javabuch.de