Java中对于字节流的读取方式-阿里云开发者社区

开发者社区> 沉默王二> 正文

Java中对于字节流的读取方式

简介: Java中对于字节流的读取方式
+关注继续查看

大家好:


今天我想介绍一下socket中字节流的读取方式,避免在socket读取过程中发生的断包问题。


1.设计字节发送的方式


在字节流的读写过程中,需要先发送一个代表发送内容长度的字节,然后再发送内容,在接收端先接受发送端发送的内容长度,再根据长度来读取相应的内容。


2.构建字节流的读写类

BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());



3.发送端的发送方式

out.write(NumberUtil.intToByte(data.length));// NumberUtil类是把int和字节转换的类,在附件中附送
out.write(data);
out.flush();




4.接收端的接收方式

protected byte[] read() throws IOException {
    byte[] buf = null;
    // 读取长度
    int contentLength = readInt();
    // 如果消息的长度不够
    if (contentLength > in.available()) {
  buf = BytesUtil.readBytes(in, contentLength);//BytesUtil类为读取指定长度字节的一个共通类,在附件中附送,也就是说当前缓冲流的可读字节长度<真实字节长度,那么我们需要一直读,直到读取了我们需要的长度
    } else {
  buf = new byte[contentLength];
  in.read(buf, 0, contentLength);
    }
    return buf;
}
    private int readInt() throws IOException {
  // 四个字节大小
  byte[] tmpByte = new byte[4];
  // 读取四个字节判断消息长度
  in.read(tmpByte, 0, 4);
  // 将byte转为int
  return NumberUtil.byteToInt(tmpByte);
    }




5.介绍readBytes方法


/**
  *    读取输入流中指定字节的长度   
  * 
  * @param in     输入流     
  * @param length 指定长度     
  * @return       指定长度的字节数组 
  */
    public static byte[] readBytes(InputStream in, long length) throws IOException {
  ByteArrayOutputStream bo = new ByteArrayOutputStream();// 建立字节流
  byte[] buffer = new byte[1024];//1024长度
  int read = 0;
  while (read < length) {// 循环将需要读取内容写入到bo中
    int cur = in.read(buffer, 0, (int) Math.min(1024, length - read));
    if (cur < 0) {//直到读到的返回标记为-1,表示读到流的结尾
    break;
    }
    read += cur;//每次读取的长度累加
    bo.write(buffer, 0, cur);
  }
  return bo.toByteArray();//返回内容
    }

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10022 0
一种简单快捷的java热部署方式
热部署是帮助开发人员提高效率的利器,如果你的开发语言是java,开发环境是远程服务器,远程服务器debug端口被限制,那么你可能无法通过debug HotSwap实现热部署,那么本文介绍的IntelliJ IDEA插件可以帮助你在远程服务器实现热部署,而且操作简单快捷。
756 0
java实战晋级技巧(二)Java三种获得class的方式
java实战晋级技巧(二)Java三种获得class的方式
5 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13835 0
js中使用Java的方式
1. 使用DWR框架  2. 使用AJAX方式
617 0
Java 8 到 Java 14,改变了哪些你写代码的方式?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性。 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些。
624 0
java-多线程 | 实现方式
线程和进程的区别: 一、关于进程和线程,首先从定义上理解就有所不同 1、进程是什么? 是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独 立运行的一段程序。
1066 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
1084
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载