如何防止发到打印机的数据不会因超过打印机数据缓冲上限而丢失?

问题描述

用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(); } }

时间: 2024-09-20 08:02:13

如何防止发到打印机的数据不会因超过打印机数据缓冲上限而丢失?的相关文章

网络 linux-用ostinato构造一数据包(有Dmac、Smac),数据包本地发出后,在目的端抓不到该数据包

问题描述 用ostinato构造一数据包(有Dmac.Smac),数据包本地发出后,在目的端抓不到该数据包 用ostinato构造一数据包(有源mac和目的mac以及ethtype),数据包本地发出后(本地wireshark可以抓到发出的包),在目的端抓不到该数据包?求解

数据同步华丽上位,大数据离线处理高枕无忧

       大数据时代,业务量不断增长,大批量的数据离线同步已成了不可获缺的工具.        阿里云数据集成是开源DataX的服务化版本,支持400种异构数据源之间的数据同步,同时支持作业级别和数据源级别的流控.分布式并发运行以及脏数据阈值处理,是大数据处理中不可缺失的数据同步工具.        而越是使用越频繁的产品,更容易成为用户关注的焦点. 尤其在操作界面上,如果逻辑层次分配不够清晰,也会带来非常大的工作量. 1.重复报错的显示让操作更简单 2.界面的视觉交互,是获取信息的主入口

软件-蓝牙数据中被插入了其他数据

问题描述 蓝牙数据中被插入了其他数据 太奇怪了,今天客户反应用我们的软件和智能硬件同步的时候同步失败.我让他发了连接日志. 奇怪的是日志里竟然过出来一些数据,这些数据竟然还是软件的包名 怎么回事 解决方案 批量将数据插入MySQL数据库的PHP代码

java以webservice形式向发送远程数据,发送时出现重复数据,如何解决?

问题描述 java以webservice形式向发送远程数据,发送时出现重复数据,如何解决? 我是用java从本地数据库中(oracle)提取数据后,封装,发送给远程服务器,然后远程服务器会返回发送结果代码. 我在主表中的每条数据都有一个字段显示其发送次数,还有一个字段显示发送结果.再有一张结果表,专门存储每条数据每次发送的结果和错误原因等详细信息.两张表是一对多关系.主表对每条数据是唯一的,当发送完,次数字段会增加1,发送结果也会更新 最新一次数据发送的结果.平时数据量小的时候完全没有问题,比如

毛新生:有了新数据才能冠之曰“大”数据

IBM开发中心首席技术官,创新工程院院长毛新生(腾讯科技配图)腾讯科技讯12月18日消息,第十届中国互联网经济论坛今日隆重开幕,会议的主题为"得势者·得天下".IBM开发中心首席技术官,创新工程院院长毛新生发表演讲表示,天越来越成为人们生活中获取信息和使用应用的一个主要的设备,我们已经告别,正在告别PC的时代,进入移动的时代,对于任何一个企业来讲,都意味着一个巨大的变化.毛新生称,这个变化简单的来讲就是说它的业务流程的接触点已经逐渐的从PC进入到移动,并且日渐以移动的设备作为一个主要的

大数据有大价值 顶尖公司大数据收入榜单

据了解,互联网上每一秒钟传输的视频,需要花费一个人5年的时间才能看完.可以说,用"海量.爆炸性增长"来形容大数据,已经不是什么新鲜事了.(以下数据来自:2015年中国大数据交易白皮书) 据统计,2014年全球大数据市场规模达到285亿美元,实现53.23%的增长,2015年,全球大数据总体加速发展趋势不变,预计大数据市场规模将达到421亿美元;到2020年,全球大数据市场规模将达到1263.21亿美元,同比增长17.51%. 大数据已成为全球IT支出的新增长点,这块不断增大的蛋糕开始吸

发送tcp数据时,不同socket的数据及ACK有无优先级区别

问题描述 发送tcp数据时,不同socket的数据及ACK有无优先级区别 同时两个tcp流 一个正在发送数据,sendbuffer内还有多个包未发 另一个收到数据 需要发送ACK 那这个ACK是不是要等第一个流的sendbuffer被发完后再发送? 能不能插队? 谢谢

以远大抱负和满腔热忱阔步迈进大数据时代 全国首家区域性数据学会在湘潭成立

5月8日,湘潭市数据学会召开成立大会,标志着全国第一个区域性数据学会诞生.湖南省档案局局长胡振荣.湘潭市政协副主席周韶光参加成立大会,中国档案学会.中国大数据网.湖南省档案学会等单位发来贺信. 胡振荣指出:过去人类社会的记忆主要使用纸质载体,现在记忆的载体转向了数据,这就意味着档案工作的对象发生了根本性的变化.胡振荣充分肯定湘潭市档案部门对如何做好大数据时代下的档案工作进行的积极探索,在全省甚至在全国带了一个好头.他希望数据学会发挥学术团体的优势,把广大档案工作者.数据工作者凝聚起来,在数据技术

做大数据领域的“福尔摩斯”,挖掘数据关系的真正价

众所周知,DT时代数据呈爆炸性增长,动辄达到数百TB甚至数十至数百PB规模的行业/企业大数据已远远超过了现有传统的计算机技术和信息系统的处理能力.因此,寻求有效的大数据处理技术.方法和手段已经成为现实世界的迫切需求. 对于企业来说,如何在大数据中淘金挖掘价值是最大的难题.面对数据量以及数据类型的复杂多变,挖掘工作越来越复杂,也越来越难以控制.对于新型大数据来说,哪个方向是重点,哪个分析是关键?为什么新型数据这么难以控制?针对企业来讲,究其根本的原因,是我们还没有找到数据与数据之间最重要,也是挖掘