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();//返回内容
  }
相关文章
|
6月前
|
存储 移动开发 Java
从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)
从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)
|
1月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
35 1
|
1月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
78 1
|
3月前
|
存储 缓存 Java
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
53 3
|
5月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流处理二进制数据,如图像,由InputStream/OutputStream家族管理;字符流处理文本,基于Reader/Writer,适于文本文件。在文件复制示例中,字节流用FileInputStream/FileOutputStream,字符流用FileReader/FileWriter。选择流类型取决于数据类型和处理需求,文本文件优选字符流,二进制数据则选字节流。
73 6
|
5月前
|
存储 编解码 安全
一篇文章讲明白java字符流字节流
一篇文章讲明白java字符流字节流
23 0
|
5月前
|
存储 自然语言处理 Java
Java IO流完全手册:字节流和字符流的常见应用场景分析!
【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流用于二进制文件读写及网络通信,如图片和音频处理;字符流适用于文本文件操作,支持多语言编码,确保文本正确性。在处理数据时,根据内容类型选择合适的流至关重要。
75 0
|
5月前
|
自然语言处理 Java
Java IO流进阶教程:掌握字节流和字符流的高级用法!
【6月更文挑战第26天】Java IO流助你高效交换数据,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)的高级技巧。缓冲流(Buffered*)提升读写性能,对象流(Object*Stream)支持对象序列化。字符流的BufferedReader/BufferedWriter优化文本处理,注意字符集如UTF-8用于编码转换。掌握这些,优化IO操作,提升代码质量。
52 0
|
5月前
|
Java 测试技术
Java IO流深度剖析:字节流和字符流的性能对比!
【6月更文挑战第26天】Java IO流分字节流和字符流,字节流处理所有类型数据(如图片),字符流处理文本(基于Unicode)。字节流直接处理,性能高,适合非文本文件;字符流处理文本时考虑编码,适合文本文件。性能测试显示,字节流在读写非文本文件时更快,而字符流在处理文本时更方便。选择流类型应依据数据类型和需求。
69 0
|
5月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
【6月更文挑战第26天】Java IO流涵盖字节流与字符流。字节流(InputStream/OutputStream)处理数据单位为字节,适用于二进制和文本,而字符流(Reader/Writer)专注于文本,处理单位为字符,处理编码转换。字符流在字节流基础上添加编码处理,以装饰器模式实现。文件复制示例展示了两者区别:字节流直接复制所有数据,字符流处理字符编码。理解并选择适当流类型对优化程序至关重要。
138 0