字节输入流输出流之间的通信

jinyibin00 贡献于2012-08-29

作者 雨林木风  创建于2012-08-29 09:02:00   修改者雨林木风  修改于2012-08-29 09:20:00字数1348

文档摘要:由于输入流无法准确获取信息实际长度,所以在发送信息的时候必须告诉另一方信息的长度是多少,所以我们必须把长度也封装成字节数组,下面这个函数就起到了此功能
关键词:

由于输入流无法准确获取信息实际长度,所以在发送信息的时候必须告诉另一方信息的长度是多少,所以我们必须把长度也封装成字节数组,下面这个函数就起到了此功能; /** * 将一个int型数据转换成字节数组 * @param integer int型数据 * @param len 此数据所占字节数 * @return 转换后的字节数组 */ public static byte[] intToByte(int integer ,int len){ if (integer < 0) { throw new IllegalArgumentException("Can not cast negative to bytes : " + integer); } ByteArrayOutputStream bo = new ByteArrayOutputStream(); for (int i = 0; i < len; i ++) { bo.write(integer); //一个int型占4个字节 ,一个字节8位 integer = integer >> 8; } //返回此字节数组 return bo.toByteArray(); } 在另一端接收时,首先必须知道信息的长度才能读,所以需要先读取长度,下面此方法即从输入流中读取指定长度的字节数组 一般读取长度时为readBytes(in,4); 即从输入流中读取前4个字节这4个字节就是信息的长度length信息(int为4个字节)。知道长度后 在调用readBytes(in,length);这样就可以实现将长度信息和内容信息分别读取的效果; /** * 读取输入流中指定字节的长度 * @param in 输入流 * @param length 指定长度 * @return 指定长度的字节数组 */ public static byte[] readBytes(InputStream in, long length) { ByteArrayOutputStream bo = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int read = 0; int cur = 0;; while (read < length) { try { cur = in.read(buffer, 0, (int)Math.min(1024, length - read)); } catch (IOException e) { ExceptionUtil.throwActualException(e); } if (cur < 0) { break; } read += cur; bo.write(buffer, 0, cur); } return bo.toByteArray(); } } 读出长度后(为一个长度为4的字节数组)需要将其转换为数字,会用到下面此方法。 / ** * 将一个byte数组转换为int型数据 * @param bytes byte数组 * @return int数据 */ public static int bytesToInteger(byte[] bytes){ int integer = 0; int len = bytes.length; for (int i = 0; i < len; i ++) { //一个int型占4个字节 ,一个字节8位 int temp = 0; temp = temp | bytes[i]; temp = temp << 8*i; integer = integer | temp; } return integer; }

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档