在字节流中,读取一个字节返回的是一个int类型,但是一个int不是占4个字节吗,这个似乎相互矛盾a
摘抄:因为java读取read()方法时候,底层由c++实现,返回的是 unsigned byte ,取值范围为[0,255],而byte的取值范围是[-128,127], 那么[128, 255]就没有办法表示了,然后就会把byte升级为int,int就可以表示[128,255], 不过为什么不用short去接受返回呢???菜鸟求解
######回复 @快乐的一只小青蛙 : 糊涂之言,勿怪!!######回复 @kakai : short是C语言的基本类型之一。 C语言整形数据包括char、short、int、long######Java没有unsigned###### ######哪儿矛盾了,返回的int值表示读取的字节数,并不是读取到的字节
######可是,调用 public abstract int read() throws IOException,返回的是 0 到 255 范围内的 int 字节值。######摘要
调用 read(), 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。
调用 read(byte[] b), 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。
1. 的确,public abstract int read()
throws IOException
输入流中读取数据的下一个字节。但是,返回的是 0 到 255 范围内的 int 字节值。一个字节能表示的最大的整数就是255(二进制11111111=十进制255)。所以,返回值的类型是 int。"read()的底层是由C++实现的,返回的是unsigned byte,取值范围为[0~255],在java中没有对应的类型,所以只能用int类型接收"。
如下代码,详述通过 java 使用的 Unicode 编码 读取 中文字符的案例。
import java.math.BigInteger;
public class ByteArray1 {
public static void main(String[] args) {
int zhong = (int)'中';
System.out.println( "字符 '"+ (char)zhong + "',其 UNICODE: " + zhong + "(十进制)");
// 通过建立一个 BigInteger 对象,获得 长度为2的字节数组 byte bete[]。
BigInteger b = new BigInteger(String.valueOf(zhong));
String zh = b.toString(2);
System.out.println( addZero(zh, 16) + "(二进制)" ); // 输出字符 '中' 的 二进制的字符串形式
byte bete[] = b.toByteArray();//返回一个 byte 数组,该数组包含此 BigInteger 的二进制补码表示形式。
for (int j=0; j<bete.length ; j++){
byte bn = bete[j];
String str = Integer.toBinaryString(bn);
System.out.println( bn + "( 二进制: " + addZero(str, 8) + ")"); // 输出 每个字节元素的字节值的二进制表示
}
}
/* 将一个 整型 (16位) 或 字节(8位) 转化成 二进制表示的字符串时,
* 若字符串长度不足 16位 或 8位 时,将空位补 0。
*/
static String addZero(String s, int length){
String add="";
for(int k=0; k< ( length - s.length()); k++)
add += "0";
return add + s;
}
}
输出:
字符 '中',其 UNICODE: 20013(十进制)
0100111000101101(二进制)
78( 二进制: 01001110)
45( 二进制: 00101101)
2. 如果调用 方法
public int read(byte[] b)
throws IOException
其功能是:"从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数"。注意,这时读取到的输入流的每个字节的值,依次存入缓冲区数组 b 的各个元素之中。
结论:
参考:
######哪儿矛盾了,返回的int值表示读取的字节数,并不是读取到的字节
我也这样认为
######如果调用 方法 public int read(byte[] b) throws IOException 其功能是:从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。注意,读取到的输入流的每个字节值,依次存入缓冲区数组 b 的各个元素之中。调用 read(), 返回字节的值。######还有这么多人,居然方法的功能都不知道,, read和read(byte[])的功能都不同,
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。