`
OpenMind
  • 浏览: 176976 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

问题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。

 

 

分享到:
评论

相关推荐

    JAVA语言中read方法分析

    read0:从输人流中读取数据的下一个字节。 read(byte[]b):从输入流中读取一定数量的字节,并将其存储在缓 冲区数组b中 read(byte[]b,int oK int len):将输入流中最多len个数据字节渎 入byte数组,从下标为off的...

    微信公众平台接口使用-连接验证(asp.net)

    s.Read(b, 0, (int)s.Length); postStr = Encoding.UTF8.GetString(b); if (!string.IsNullOrEmpty(postStr)) { //读取xml内容 XmlDocument doc = new XmlDocument(); doc.LoadXml(postStr);

    java io InputStream and outputStream

    byte[] cont = new byte[(int) file1.length()]; is.read(cont);// 读取文件 for (int i = 0; i &lt; cont.length; i++) { System.out.print((char) cont[i]); } is.close();// 关闭文件 ...

    java io读取文件到String

    3个方法去读取一个大于50M的文件,当不设置jvm参数时都OutofMemery,当设置-Xmx128M时。只有方法3 可以通过,设置到-Xmx256M时也只有方法3可以通过,干脆设置512M,都可以了,运行时间如果正常的话一般都在4~5S

    day019-io笔记和代码.rar

    int read(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。 * 2.输出流 abstract class OutputStream:这个抽象类是表示输出字节流的所有类的超类。 * ...

    android读取assets文件示例

    代码如下:// 读取assets文件private void assetsRead(){String fileName = “my_assets.txt”;// assets下文件//String fileName = “test/my_assets_test.txt”;// assets下子目录文件String ret = “”;try {...

    Interface的测试代码,请光临

    // 发生致命的异常,可能是协议不对或者返回的内容有问题 System.out.println("Please check your provided http address!"); e.printStackTrace(); } catch (IOException e) { // 发生网络异常 e....

    Java文件处理工具类--FileUtil

    * 读取文件并返回为给定字符集的字符串. * @param fileName * @param encoding * @return * @throws Exception */ public static String readFileAsString(String fileName, String encoding) throws ...

    计算机网络实验报告 获取MAC socket通信

    // 读取本地文件 try { java.io.FileInputStream fis = new java.io.FileInputStream( new java.io.File("d:\\数据库.zip")); // 转换成网络输出流 java.net.ServerSocket ss = new java.net....

    c# 加密和解密相关代码

    如果两个二进制数的相应位中一个为1 一个为0,则返回1,最后得到的结 果为二进制值11000,该值转换为十进制为24,所以得到的加密结果为24。而解密过程也很简单,只是将加密 结果24与加密数字15 进行“异或”运算,将...

    编写简单的代理服务器(java源码)

    代理服务器打开一个端口接收浏览器发来的访问某个站点的请求,从请求的字符串中解析出用户想访问哪个网页,让后通过URL对象建立输入流读取相应的网页内容,最后按照web服务器的工作方式将网页内容发送给用户浏览器 ...

    使用urlconnection下载文件或图片并保存到本地

    byte[] bs = new byte[1024]; // 读取到的数据长度 int len; // 输出的文件流 OutputStream os = new FileOutputStream(filename); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0...

    网络文件下载程序-基于Java源代码.rar

    网络文件下载程序-基于Java的源代码,给定一个文件的网络URL地址,本程序将从该地址获取(下载)文件,java环境的手机,可直接运行本程序,具体代码:  in = (InputStream) Connector.openInputStream(url); //...

    java文件上传程序.doc

    byte[] b = new byte[1024]; while (true) { len = is.read(b); if (len==-1) { break; } os.write(b,0,len); os.flush(); } } catch (Exception e) { e.printStackTrace(); } finally{ try { if (is!=null) { is....

    strust文件上传

    //这个地方是处理上传的为M单位计算时,下一个是以kb,在下一个是byte; if(ok&gt;=1024*1024) { float ok1=(((float)ok)/1024f/1024f); DecimalFormat myformat1 = new DecimalFormat("0.00"); strFee = ...

    java 编写文件上传类简单易用

    String subBytesString(byte[] source,int from,int end) 直接返回一个 String int bytesLen(String s) 返回字符串转化为字节数组后,字节数组的长度 这样,从一个字节数组中,根据标记提取出另一个字节数组可以...

    简单j2me实现手机通讯录的备份与还原(源码)

    思路很简单,通过pim读取通讯录保存到文件中完成备份工作。还原时再通过这个文件还原通讯录 http://blog.csdn.net/xiaoxiao108/archive/2010/10/17/5947240.aspx 如果你发现有什么不合理的,需要改进的地方,联系...

    ganymed-ssh2-build210.jar java远程访问linux服务器操作、上传下载文件

    //打开一个会话 session.execCommand(cmd);//执行命令 result=processStdout(session.getStdout(),DEFAULTCHART); //如果为得到标准输出为空,说明脚本执行出错了 if(StringUtils.isBlank(result)){ result=...

    Android 读写文件方法汇总

    一、 从resource中的raw文件夹中获取文件并读取数据(资源文件只能读不能写) 代码如下:String res = “”;try{InputStream in = getResources().openRawResource(R.raw.bbi);//在\Test\res\raw\bbi.txt,int length ...

    excel-template-export.rar

    byte[] buff = new byte[2048]; int bytesRead; //读取并写入 while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (Exception e) { e....

Global site tag (gtag.js) - Google Analytics