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();//返回内容
  }
相关文章
|
存储 移动开发 Java
从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)
从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)
|
11月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
132 1
|
11月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
395 1
|
存储 缓存 Java
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
115 3
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流处理二进制数据,如图像,由InputStream/OutputStream家族管理;字符流处理文本,基于Reader/Writer,适于文本文件。在文件复制示例中,字节流用FileInputStream/FileOutputStream,字符流用FileReader/FileWriter。选择流类型取决于数据类型和处理需求,文本文件优选字符流,二进制数据则选字节流。
138 6
|
存储 缓存 Java
【Java IO系列】那字节流和字符流有什么区别?
而如果使用缓存流,一次性从文件里读取多个字节到缓存中,可以减少系统调用同时也减少了磁盘读取,提高了读取的效率。所以字符流是一个很方便的流了,没有必要把一个方便的流转换成一个不方便的流。,涉及到用户空间和内核空间之间的上下文切换,这些切换是很昂贵的。从输入流读取下一个数据字节,值字节以0到255范围内的。好的面试官,Java IO有两个参与对象,一个是。,这个基类提供了3个方法可以来读取字节流。,同样是提供了3个方法来支持字符流读取。好的,有这些不同之处,主要是3个方面。是这样的,虽然字节流比字符流的。
169 1
【Java IO系列】那字节流和字符流有什么区别?
|
Java
java一分钟之-字符流与字节流的区别
【5月更文挑战第11天】Java的输入输出通过流操作,分为字符流和字节流。字节流处理二进制数据,如图片、音频,基类是`InputStream`和`OutputStream`;字符流处理文本,基类是`Reader`和`Writer`。字符流涉及编码转换,字节流不涉及。易错点包括乱码(需指定编码)、混用流类型和忘记关闭流。示例展示了字节流和字符流读文件。理解区别并注意编码和资源管理可提高代码质量。
137 3
|
存储 编解码 安全
一篇文章讲明白java字符流字节流
一篇文章讲明白java字符流字节流
65 0
|
存储 自然语言处理 Java
Java IO流完全手册:字节流和字符流的常见应用场景分析!
【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流用于二进制文件读写及网络通信,如图片和音频处理;字符流适用于文本文件操作,支持多语言编码,确保文本正确性。在处理数据时,根据内容类型选择合适的流至关重要。
267 0
|
自然语言处理 Java
Java IO流进阶教程:掌握字节流和字符流的高级用法!
【6月更文挑战第26天】Java IO流助你高效交换数据,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)的高级技巧。缓冲流(Buffered*)提升读写性能,对象流(Object*Stream)支持对象序列化。字符流的BufferedReader/BufferedWriter优化文本处理,注意字符集如UTF-8用于编码转换。掌握这些,优化IO操作,提升代码质量。
129 0

热门文章

最新文章