问题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。
相关推荐
read0:从输人流中读取数据的下一个字节。 read(byte[]b):从输入流中读取一定数量的字节,并将其存储在缓 冲区数组b中 read(byte[]b,int oK int len):将输入流中最多len个数据字节渎 入byte数组,从下标为off的...
s.Read(b, 0, (int)s.Length); postStr = Encoding.UTF8.GetString(b); if (!string.IsNullOrEmpty(postStr)) { //读取xml内容 XmlDocument doc = new XmlDocument(); doc.LoadXml(postStr);
byte[] cont = new byte[(int) file1.length()]; is.read(cont);// 读取文件 for (int i = 0; i < cont.length; i++) { System.out.print((char) cont[i]); } is.close();// 关闭文件 ...
3个方法去读取一个大于50M的文件,当不设置jvm参数时都OutofMemery,当设置-Xmx128M时。只有方法3 可以通过,设置到-Xmx256M时也只有方法3可以通过,干脆设置512M,都可以了,运行时间如果正常的话一般都在4~5S
int read(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。 * 2.输出流 abstract class OutputStream:这个抽象类是表示输出字节流的所有类的超类。 * ...
代码如下:// 读取assets文件private void assetsRead(){String fileName = “my_assets.txt”;// assets下文件//String fileName = “test/my_assets_test.txt”;// assets下子目录文件String ret = “”;try {...
// 发生致命的异常,可能是协议不对或者返回的内容有问题 System.out.println("Please check your provided http address!"); e.printStackTrace(); } catch (IOException e) { // 发生网络异常 e....
* 读取文件并返回为给定字符集的字符串. * @param fileName * @param encoding * @return * @throws Exception */ public static String readFileAsString(String fileName, String encoding) throws ...
// 读取本地文件 try { java.io.FileInputStream fis = new java.io.FileInputStream( new java.io.File("d:\\数据库.zip")); // 转换成网络输出流 java.net.ServerSocket ss = new java.net....
如果两个二进制数的相应位中一个为1 一个为0,则返回1,最后得到的结 果为二进制值11000,该值转换为十进制为24,所以得到的加密结果为24。而解密过程也很简单,只是将加密 结果24与加密数字15 进行“异或”运算,将...
代理服务器打开一个端口接收浏览器发来的访问某个站点的请求,从请求的字符串中解析出用户想访问哪个网页,让后通过URL对象建立输入流读取相应的网页内容,最后按照web服务器的工作方式将网页内容发送给用户浏览器 ...
byte[] bs = new byte[1024]; // 读取到的数据长度 int len; // 输出的文件流 OutputStream os = new FileOutputStream(filename); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0...
网络文件下载程序-基于Java的源代码,给定一个文件的网络URL地址,本程序将从该地址获取(下载)文件,java环境的手机,可直接运行本程序,具体代码: in = (InputStream) Connector.openInputStream(url); //...
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....
//这个地方是处理上传的为M单位计算时,下一个是以kb,在下一个是byte; if(ok>=1024*1024) { float ok1=(((float)ok)/1024f/1024f); DecimalFormat myformat1 = new DecimalFormat("0.00"); strFee = ...
String subBytesString(byte[] source,int from,int end) 直接返回一个 String int bytesLen(String s) 返回字符串转化为字节数组后,字节数组的长度 这样,从一个字节数组中,根据标记提取出另一个字节数组可以...
思路很简单,通过pim读取通讯录保存到文件中完成备份工作。还原时再通过这个文件还原通讯录 http://blog.csdn.net/xiaoxiao108/archive/2010/10/17/5947240.aspx 如果你发现有什么不合理的,需要改进的地方,联系...
//打开一个会话 session.execCommand(cmd);//执行命令 result=processStdout(session.getStdout(),DEFAULTCHART); //如果为得到标准输出为空,说明脚本执行出错了 if(StringUtils.isBlank(result)){ result=...
一、 从resource中的raw文件夹中获取文件并读取数据(资源文件只能读不能写) 代码如下:String res = “”;try{InputStream in = getResources().openRawResource(R.raw.bbi);//在\Test\res\raw\bbi.txt,int length ...
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....