From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../hjp5/html/k100171.html | 361 +++++++++++++++++++++ 1 file changed, 361 insertions(+) create mode 100644 Master/Reference Architectures and Patterns/hjp5/html/k100171.html (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100171.html') diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100171.html b/Master/Reference Architectures and Patterns/hjp5/html/k100171.html new file mode 100644 index 0000000..463a90d --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100171.html @@ -0,0 +1,361 @@ + + + +Handbuch der Java-Programmierung, 5. Auflage + + + + + + + + + +
 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.1 +
 <<  +  <   +  >   + >>  + API  +© 1998, 2007 Guido Krüger & Thomas +Stark, http://www.javabuch.de +
+ + + -- cgit v1.2.3