`
qing_gee
  • 浏览: 121926 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

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();//返回内容
	}

 总结:基于TCP/IP的传输方式中,TCP是不会丢包的,如果在你的程序中发生了字节的丢失,请检查你的socket输入字节流的读取方式,一定要注意以上代码中的红色标出的内容。

 

感谢你的阅读,对自己负责、对父母感恩!

 

 

  • util.7z (1.3 KB)
  • 下载次数: 34
0
0
分享到:
评论

相关推荐

    Java字节流数据逐行读取(readLine)

    以下是一个使用`BufferedReader`和`InputStreamReader`结合字节流读取文本文件逐行的示例: ```java import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; public ...

    Java中的字节流.

    在Java中,字节流是一种处理二进制数据的基本方式。它通过一系列类来实现数据的读取和写入功能,这些类主要继承自`InputStream`和`OutputStream`两个抽象类。字节流非常适合处理非文本文件(如图片、音频等)以及...

    Java中的字节流文件读取教程(一)

    Java中的字节流文件读取教程(一) 本篇文章主要介绍了Java中字节流文件读取的相关知识,通过示例代码详细介绍了字节流文件读取的原理和使用场景。下面是相关知识点的总结: 1. Java中的IO流设计 Java的IO流设计...

    javaIO字节流读取文件方式总结共4页.pdf.zip

    本资料“javaIO字节流读取文件方式总结共4页.pdf”详细介绍了Java字节流在读取文件时的各种方法和应用场景。本文将深入探讨这些知识点。 首先,Java中的字节流分为输入流(InputStream)和输出流(OutputStream)。...

    Java实现字节流与图片的转化

    在Java编程中,字节流(Byte Stream)是处理数据的基本方式,特别是在处理二进制数据,如图片、音频或视频文件时。本教程将详细讲解如何使用Java实现字节流来转换和处理图片。 首先,我们需要理解字节流的概念。在...

    Java字节流 .pdf

    Java字节流是一种用于处理字节数据的流处理机制,在Java中,字节流不包含边界数据的连续流,字节流是由字节组成的,Java里字符由两个字节组成。字节流是最基本的,它是按字节来处理二进制数据。 字节流基类有:字节...

    Java IO字符流和字节流

    Java中的`InputStream`和`OutputStream`是所有字节流的基类。 - **`InputStream`**:用于从源设备读取字节数据。 - **`OutputStream`**:用于向目标设备写入字节数据。 ##### 2. 字节流的基本API - **`public int...

    Java字符流和字节流

    在Java中,所有字节流类都是`java.io.InputStream`或`java.io.OutputStream`的子类。这两个类提供了基本的读写操作方法,例如`read()`和`write()`。 **1. 文件输出流(FileOutputStream)** - `FileOutputStream`类...

    JAVA 字符流与字节流

    在Java编程语言中,输入/输出(I/O)操作是处理数据流的关键部分,而字符流与字节流则是实现这些操作的两种基本方式。理解它们的区别和应用场景对于任何Java开发者来说都是至关重要的。 ### 字节流 字节流是最基本...

    Java实现字节流与图片的转化Java源码

    在Java编程中,字节流(Byte Stream)是处理数据的基本方式,特别是在处理二进制数据,如图片、音频或视频文件时。本教程将详细讲解如何使用Java实现字节流与图片之间的转换,这对于在网络上传输或者存储图片等二...

    Java中的字节流文件读取教程(二)

    在 Java 中,字节流文件读取可以通过多种方式来实现,包括使用 FileInputStream、FileOutputStream、BufferedInputStream 和 BufferedOutputStream 等。在本文中,我们将主要介绍使用 BufferedInputStream 实现字节...

    Java IO 字节流 字符流

    总的来说,理解Java的IO系统,特别是字节流和字符流的概念,对于开发高效、可靠的程序至关重要。通过选择合适的流类型、使用缓冲流和桥接流,以及利用工具类,开发者可以更好地处理各种数据输入输出需求。在实际项目...

    ByteIO_java_字节流_

    在Java编程语言中,字节流(Byte Stream)是I/O操作的基础,它处理的是单个字节的数据。...通过学习和理解这段代码,开发者可以深入理解Java字节流的工作原理,提升在处理二进制数据和网络通信时的能力。

    Java字节流与字符流的介绍.pdf

    Java 中的流操作可以分为两种:字节流和字符流。字节流是指以 byte 为单位进行读写操作的流,而字符流是指以 char 为单位进行读写操作的流。 字节流的介绍 字节流的所有读操作都继承自一个公共超类 java.io....

    java IO流读写

    在Java中,IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流处理单个字节的数据,而字符流则处理Unicode编码的16位字符。 1. **字节流**: - `InputStream` 和 `OutputStream` 是所有...

    字节流实现从文件以字节读取信息

    本文将详细介绍如何使用Java中的字节流技术来实现从文件中按字节读取信息,并将其转换为字节数组。 #### Java中的字节流简介 Java提供了一套强大的流处理机制,使得开发者能够方便地进行数据的读写操作。字节流是...

    Java基础11-(字节流、字符流)

    Java的IO流是按照数据的流向分为输入流和输出流,按照数据类型分为字节流和字符流。字节流处理的是二进制数据,适用于任何类型的文件,包括文本文件和非文本文件(如图片、音频、视频等)。字符流则用于处理字符数据...

    Java基于IO流读取文件的方法

    总的来说,Java基于IO流读取文件的过程包括以下几个步骤: 1. 获取文件路径并解码。 2. 创建`File`对象,表示要读取的文件。 3. 使用`FileInputStream`创建字节输入流,用于读取二进制数据。 4. 使用`...

Global site tag (gtag.js) - Google Analytics