文档章节

为什么InputStream.read()读取一个byte确返回一个int呢?

BlackJoker
 BlackJoker
发布于 2015/10/13 13:24
字数 406
阅读 63
收藏 0

问题1:为什么InputStream.read()读取一个byte却返回一个int呢?

InputStream.read()返回一个unsigned byte [0 - 255],而java里面没有这个类型,所以用int接收。

byte的范围是[-128,127],所以如果read()返回的数在[128,255]的范围内时,则表示负数,即

 

(byte)128=-128

 

(byte)129=-127

 

(byte)255=-1

 

所以如果read()返回的是byte的话,那就会有负数。而"返回-1意味着结束",这个信息量用byte是无法表达的,所以必须用int。

 

问题2:如何把一个整数(int)正确保存到一个byte数组,并从里面正确的读出来?

先看代码再解释:

public static int readInt(byte[] readBuffer, int offset) {
		int i = offset;
		//readBuffer[i]范围是[-128,127],转整形时必须是[0,255]
		int ch1 = readBuffer[i++] & 255;
		int ch2 = readBuffer[i++] & 255;
		int ch3 = readBuffer[i++] & 255;
		int ch4 = readBuffer[i++] & 255;
		return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
	}

	public static void writeInt(int v, byte[] writeBuffer, int offset) {
		int i = offset;
		//这里面会存在负数
		writeBuffer[i++] = (byte) (v >>> 24);
		writeBuffer[i++] = (byte) (v >>> 16);
		writeBuffer[i++] = (byte) (v >>> 8);
		writeBuffer[i++] = (byte) (v >>> 0);
	}

 

 

对于writeInt:v无符号右移>>>肯定是正数,即[0,255],用byte强转型后就可能负数[-128,127]。

 

对于readInt:readBuffer[i++]是有负数的,必须转成无符号整形,即&255变成[0,255]范围之后才可以用于组装int。 

 

延伸3:

 OutputStream.write(int b):相当与write(b&255),

如果你write(-2),因为-2&255=254,那么相应的r = InputStream.read()返回的是254,需要(int) (byte) r才能获取你想要的值((byte)254=-2)

 

结论:可以认为OutputStream和InputStream里面都是unsigned byte。

 

 

© 著作权归作者所有

共有 人打赏支持
BlackJoker
粉丝 1
博文 17
码字总数 9270
作品 0
深圳
高级程序员
私信 提问
java InputStream读取数据问题

转载地址:点击打开链接 首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len)。其中read()方法是一次读取一个字节...

lwang_IT
2017/12/24
0
0
socket获取数据 获取流超时

首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len)。其中read()方法是一次读取一个字节,鬼都知道效率是非常低...

todostyles
2017/11/06
0
0
Android开发 socket

这几天完全被socket 卡住了, 主要原因就是就ip,Socket通信主要有俩种,1,TCP,2,UDP 一,什么时候SOCKET通信: 你经常听到人们谈论着 “socket”,或许你还不知道它的确切含义。现在让我...

DURONG
2012/05/04
0
4
通过JDBC和Hibernate对Clob和Blob的操作

本文主要简介通过JDBC和Hibernate对Clob和Blob的操作,插入和读取. 一,JDBC方式: 1,当lob的内容很小的时候,用sta.setString(2, "clob content"); sta.setBytes(3, "blob".getBytes()); 2,通过......

晨曦之光
2012/04/25
903
0
android 开发之socket编程 UDP和TCP通信实现

  1、 Socket通信模型如下: 下载附件 (33.58 KB)   应用程序通过套接字可以进行通信,可以使用udp协议或者使用tcp协议   当客户端和服务器端的协议时相对应的,客户端使用tcp,那么服...

带梦想一7飞
2012/08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MIT 6.828 main.c文件分析

#include <inc/x86.h>#include <inc/elf.h> /*这是一个简单粗略的boot loader,它唯一的工作就是从硬盘的第一个扇区启动格式为ELF的内核镜像硬盘布局这个程序(包括boot.S和mai...

FeanLau
26分钟前
0
0
SpringBoot 整合 Redis

1. pom.xml 文件中添加 Redis 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusio......

北漂的我
34分钟前
1
0
TechDay实录 | 认识PaddlePaddle:更低使用成本、更高开发效率的深度学习框架

导读: 在人工智能时代,各行各业都在尝试利用机器学习/深度学习等前沿技术来解决自身的业务需求,深度学习框架也应运而生。为了继续帮助AI开发者们在深度学习的道路上快速升级,百度PaddleP...

PaddleWeekly
35分钟前
3
0
JAVA AES加解密服务

package com.pasenger.aes;import lombok.Data;import org.apache.commons.codec.binary.Base64;import org.springframework.beans.factory.InitializingBean;import org.springframewo......

Pasenger
46分钟前
0
0
SpringCloud集成 Mybatis分表插件shardbatis 踩坑日志及其原理分析

公司新开发的系统数据量过大,需要进行分表处理,我在网上浏览一圈,选中了Shardbatis,原因有二: 1.公司项目本身集成了Mybatis,而Shardbatis是其插件,引入方便; 2.Sharbatis十分轻便,只...

L墨龙
53分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部