使用
Java communications API
实现并行端口打印
这是一个在客户支持中遇到的新问题,我在相关的网站
([url]www.rxtx.org[/url] and [url]www.sun.com.cn[/url])
上找到了一些有用的信息,最后终于在
Windows XP
和
LinuxIA32
平台下实现并行端口打印这一功能。
首先,我们要从
SUN
的网站下载
Java communications API
最新的包
(javacomm20-win32.zip)
,然后解压缩在
commapi
目录下,进入
commapi
目录中,我们可以看到
win32com.dll
,
comm.jar
,
javax.comm.properties
三个文件。在正确使用
Java communications API
之前,我们必须先配置
Java communications API
在
JDK 1.4.2
运行环境中。我们假定
JDK1.4.2
的安装目录为
"C:\java142"
。
1.
复制
win32com.dll
到
C:\java142\bin
2.
复制
comm.jar
到
C:\java142\jre\lib\ext
3.
复制
javax.comm.properties
到
C:\java142\jre\lib
,
javax.comm.properties
一定要安装,否则,我们将找不到系统中的任何并行端口。
现在,我们已经完成了
comm.jar
的安装工作,可以测试我们的程序了。下面我将给出我写的一个简单的例子:
SimpleLPTPort.java
---------- BEGIN SOURCE ----------
import java.io.*;
import java.util.*;
import javax.comm.*;
public class SimpleLPTPort {
Enumeration ports;
CommPortIdentifier portId;
ParallelPort LPTPort;
protected OutputStream out;
String outPrintStr = "When an \n\rinput method \n\ris activated, ";
public SimpleLPTPort() {
checkLPTPort();
}
public void checkLPTPort() {
ports = CommPortIdentifier.getPortIdentifiers();
if (ports == null) {
System.out.println("No comm ports found!");
System.exit(0);
}
while (ports.hasMoreElements()) {
// Get the specific port
portId = (CommPortIdentifier)ports.nextElement();
// Is this a parallel port?
if (portId.getPortType() == CommPortIdentifier.PORT_PARALLEL) {
// Is the port in use?
if (portId.isCurrentlyOwned()) {
System.out.println("Detected "
+ portId.getName()
+ " in use by "
+ portId.getCurrentOwner());
}
// Try to open the port.
try {
try {
//for(int i = 0; i <=2; i++) {
LPTPort = (ParallelPort)portId.open("ParallelPort", 2000);
System.out.println(LPTPort.getName() + " a LPT port is opened.");
if (LPTPort == null) {
System.out.println("Error opening LPT port "
+ LPTPort.getName());
}
// Get the output stream
try
{
out = LPTPort.getOutputStream();
}
catch (IOException e)
{
System.out.println("Cannot open output stream");
}
out.write(outPrintStr.getBytes());
System.out.println(outPrintStr.getBytes());
LPTPort.close();
System.out.println(LPTPort.getName() + " is closing.");
//}
System.out.println("Output stream complete.");
//LPTPort.close();
System.exit(0);
} catch (IOException ex) {
System.out.println("Output stream fail.");
System.out.println(LPTPort.getName()
+ ": Cannot write to output stream");
LPTPort.close();
System.exit(0);
}
} catch (PortInUseException e) {
System.out.println("Queueing open for "
+ portId.getName()
+ ": port in use by "
+ e.currentOwner);
}
}
}
}
public static void main(String[] args) {
new SimpleLPTPort();
}
}
---------- END SOURCE ----------
打开一个
DOS
控制窗口,先编译
SimpleLPTPort.java --> "javac SimpleLPTPort.java",
然后,我们运行该程序
--> "java SimpleLPTPort"
。如果一切都顺利的话,我们将在控制窗口看到以下的输出:
-------------------------------------
C:\fanjun\jcase\LPRPort>javac SimpleLPTPort.java
C:\fanjun\jcase\LPRPort>java SimpleLPTPort
LPT 1 a LPT port is opened.
When an
input method
is activated,
LPT1 is closing.
Output stream complete.
-------------------------------------
* LPT1
是程序检测到的系统可用的并行端口
如果在你的并行端口连接着打印机,这时将会打印出一页,内容为:
---------------------------------
When an
input method
is activated,
---------------------------------
现在,我们来理解一下上面的代码。
第
4
行:“
import javax.comm.*;
”
引入
Java communications API
第
21
行:“
ports = CommPortIdentifier.getPortIdentifiers();
”
得到系统的端口列表
第
33
行:“
portId.getPortType() == CommPortIdentifier.PORT_PARALLEL
”
从端口列表中找出可用的并行端口
第
47
行:“
LPTPort = (ParallelPort)portId.open("ParallelPort", 2000);
”
打开并行端口
第
62
行:“
out = LPTPort.getOutputStream();
”
获得并行端口输出流
第
70
行:“
out.write(outPrintStr.getBytes());
”
向并行端口写数据
第
83
行:“
LPTPort.close();
”
关闭并行端口
我写的例子是向并行端口输出了一个字符串,当然,我们也可以向并行端口输出一个文件流,我已经在
Windows XP
系统下成功地测试过了,我成功地向并行端口输出了一个文件流,并且在打印机端得到了正确的输出。