问题描述
用java写了一个程序,用来将文本文件打印出来.代码如下:package MyTest;import gnu.io.*;import java.io.*;public class comm_test02 { public static void main(String[] args) { try { (new comm_test02()).run(args[0]); } catch (Exception ex) { ex.printStackTrace(); } } private void run(String filename) throws Exception { BufferedReader br = new BufferedReader( new FileReader( new File(filename) ) ); String line = null; String lines = ""; while ((line = br.readLine()) != null) { lines = lines.concat(line).concat("n"); } CommPortIdentifier cpi = CommPortIdentifier.getPortIdentifier("/dev/lp0"); CommPort cp = cpi.open("sez", 50); ParallelPort pp = null; if (cp instanceof ParallelPort) { pp = (ParallelPort) cp; } OutputStream os = pp.getOutputStream(); os.write(lines.getBytes("GBK")); os.flush(); os.close(); pp.close(); }}上面程序用来打印简短的文件没有问题,但要打印的文件如果很大,后部分内容会打不出来.查了一下打印机的说明发现它只能缓冲2KB的数据,因此我猜测是上面的程序将所有打印数据一下子发给打印机,超出其容量的数据则被丢弃了.想请教一下各位,我的猜想是否正确?有什么方法可以保证即使文件很大也可用这种打印机全部打出来?谢谢各位. 问题补充:感谢renpeng301给予的帮助,然后我按你的提示将run方法改成了下面的样子:private void run(String filename) throws Exception { FileInputStream fis = new FileInputStream(new File(filename)); FileChannel fc = fis.getChannel(); ByteBuffer bb = ByteBuffer.allocate(2048); while (fc.read(bb) != -1) { CommPortIdentifier cpi = CommPortIdentifier.getPortIdentifier("/dev/lp0"); CommPort cp = cpi.open("sez", 50); ParallelPort pp = null; if (cp instanceof ParallelPort) { pp = (ParallelPort) cp; } OutputStream os = pp.getOutputStream(); bb.flip(); while(bb.hasRemaining()) { os.write(bb.get()); } bb.clear(); pp.close(); Thread.sleep(5000); }}但是我不得不在代码的最后一行加上"Thread.sleep(5000)",因为如果不停顿一下,打印机处理数据的速度将远赶不上程序向打印机发送数据的速度.在没有这个停顿语句的情况下,"os.write(bb.get())"最终会抛出IOException,提示"No space left on device in writeByte.虽然强制暂停可以解决问题,但有没有什么办法可以对打印机的缓冲情况做一个判断,当没有缓冲的时候暂停向打印机发送数据?还有一个问题,要打印的文件是的编码是UTF-8,要改成GBK后打印机才可以打印中文.请问怎么才能在上面的代码中实现这个要求?
解决方案
NIO缓存读写文件啊··· 设置缓存的大小为2*1024private void run(String filename) throws Exception { FileInputStream fils=new FileInputStream(fils);//得到文件通道FileChannel fc=fils.getChannel();//设定缓存区大小 ByteBuffer bf=ByteBuffer.allocate(2.1024); while (fc.read(bf) != -1) { CommPortIdentifier cpi = CommPortIdentifier.getPortIdentifier("/dev/lp0"); CommPort cp = cpi.open("sez", 50); ParallelPort pp = null; if (cp instanceof ParallelPort) { pp = (ParallelPort) cp; } bf.flip(); OutputStream os = pp.getOutputStream(); while(bf.hasRemaining){ os.write(lines.getBytes(bf.get())); }bf.clear(); } }