最近做了一个报文发送接收解析的客户端,发现了这样的问题:
某程序:
con = new Socket(ip, port);//一个socket
InputStream socketIn = con.getInputStream();
InputStreamReader isr=new InputStreamReader(socketIn, "UTF-8");
while ((headchar = isr.read()) != -1) {// 读取报文头 用字符流来读取
headres += (char) headchar;
......//一些逻辑 处理报文头
}
...
//报文头读完了 获取了报文体的大小等内容 开始读报文体
byte tempbuf[] = new byte[buffsize];
int start = 0;
int tem = -1;
//用字节流来读报文体
while ((tem = socketIn.read(tempbuf, start, buffsize)) != -1) {
log.info("从"+start+"开始读"+buffsize);
log.info("实际读取" + tem);
if (tem < outparamsizes[i]) {
start = start + tem;
buffsize = buffsize - tem;
...//一些逻辑 处理报文体 读取完毕
}
这样的程序,在windows下正常工作,再放到linux下,读完报文头开始读取报文体的时候,并没有从报文体的开头开始读取,而是丢失了报文体前面的一些数据,导致读不到足够的数据直到超时。
经过一番调试和请教后发现原因:在linux下一个InputStream不能用字符流和字节流分段读取,因为linux下的字符由于utf8编码会多加几位,用字符读完报文头后其实就已经多读了许多位,再用字节读就丢掉多读的那部分了。
因此,只要将读取报文头的部分也改成字节流读取就可以了
while ((headchar = socketIn.read()) != -1) {
...}
分享到:
- 2008-03-27 15:04
- 浏览 3950
- 评论(5)
- 论坛回复 / 浏览 (4 / 5497)
- 查看更多
相关推荐
Java 字节流与字符流的介绍 Java 中的流操作可以分为两种:字节流和字符流。字节流是指以 byte 为单位进行读写操作的流,而字符流是指以 char 为单位进行读写操作的流。 字节流的介绍 字节流的所有读操作都继承自...
`InputStream`作为所有字节输入流的基类,提供了读取字节数据的基本方法。例如,`read()`方法用于读取单个字节,`read(byte[] b)`用于读取字节数组。`OutputStream`则是所有字节输出流的基类,它提供写入字节数据的...
在Java编程语言中,输入/输出(I/O)操作是处理数据流的关键部分,而字符流与字节流则是实现这些操作的两种基本方式。理解它们的区别和应用场景对于任何Java开发者来说都是至关重要的。 ### 字节流 字节流是最基本...
### Java字节与字符 #### 一、字节流与字符流的概念 在Java的I/O包中,根据处理的数据类型不同,可以将流分为两大类:字节流和字符流。 - **字节流**:处理的是8位的数据单元,即字节,主要适用于处理二进制文件...
字节流和字符流的区别在于处理数据的基本单位不同,字节流以8位的字节为单位,而字符流则以16位的Unicode字符为单位。 字节流分为输入流(InputStream)和输出流(OutputStream),主要用来处理二进制数据,如图像...
除此之外,InputStreamReader和OutputStreamWriter是字节流与字符流之间的桥梁,它们允许我们在字节流和字符流之间转换,以适应不同编码格式的需求。 在Java IO中,还有一套转换流(Wrapper Stream),即...
InputStream是所有字节输入流的抽象基类,例如FileInputStream,用于从文件中读取字节;OutputStream则是所有字节输出流的基类,如FileOutputStream,用于向文件写入字节。字节流适合处理非文本数据,如图像、音频或...
接收端则通过Socket的InputStream读取这些字节,再根据需求还原成原始数据。 在“socket传字符”时,我们面临的问题是字符编码。因为字符可能有多种编码形式,如ASCII、UTF-8、GBK等,所以需要确保发送端和接收端...
字节流分为输入流和输出流,Java的字节输入流主要由`InputStream`类及其子类代表,如`FileInputStream`用于从文件中读取字节数据;字节输出流主要由`OutputStream`类及其子类代表,如`FileOutputStream`用于向文件...
在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...
InputStream 是所有字节输入流的父类,它提供了一种从不同来源读取字节数据的方法。例如,如果要从文件中读取数据,可以使用 FileInputStream。InputStream 的主要方法有: 1. 读取单个字节:public int read() ...
- **`InputStream`**:用于从源设备读取字节数据。 - **`OutputStream`**:用于向目标设备写入字节数据。 ##### 2. 字节流的基本API - **`public int read()`**:从输入流读取下一个字节。如果流结束,返回-1。 - ...
它们都接受一个InputStream或OutputStream作为参数,然后根据指定的字符集进行转换。 ```java import java.io.*; public class ConvertStreamDemo { public static void main(String[] args) throws IOException ...
字节输入流(`InputStream`类)用于读取字节数据。在练习四中,我们可以使用`FileInputStream`配合`read()`方法逐字节读取文件a.txt的内容,并将其输出到控制台。在练习五中,可以使用`read(byte[])`方法读取字节...
通过使用Reader类的子类,我们能够读取存储在不同字符编码格式的文本文件。 最后,Properties类在Java中用于处理配置文件。它能够加载和存储键值对形式的配置信息。load()方法可以用于从输入流中加载属性列表(键和...
然而,`readLine()`方法通常与字符流Reader类关联,而不是字节流InputStream类。因此,要使用字节流实现数据逐行读取,我们需要结合`BufferedReader`和`InputStreamReader`。 首先,理解`readLine()`方法。它是`...
5. 练习五:通过`FileInputStream`读取b.txt内容,一次读取一个字节数组,转换为字符串输出。 6. 练习六:使用字节流`FileInputStream`和`FileOutputStream`实现文件a.png的复制,一次读写一个字节。 二、字符流 ...
### 不同字符编码集的文件读取 在计算机科学领域,字符编码是将人类可读的文本转换为计算机能够理解的二进制形式的过程。不同的字符编码方式支持不同数量的字符集,这对于处理多语言环境下的文本至关重要。本文将...
因为不同的文本文件可能使用不同的字符编码(如UTF-8,GBK等),所以字符流在传输时会考虑编码问题。常见实现有FileReader和FileWriter,它们可以直接读写文本文件。BufferedReader和BufferedWriter提供缓冲功能,...