详细研究了一下OutputStream的write(int)方法的实现原理,结果把我搞糊涂了

wangcb80 2015-04-23 12:34:23
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
*OutputStream的write(int)方法,当int在byte类型的取值范围时,可以顺利写出byte值。当取值超出byte范围,其值是未知的。
*/
public class Test6 {

public void contrast(int a) throws IOException{
System.out.println("正在测试的int数是:"+a);

OutputStream os = new ByteArrayOutputStream();
//通过OutputStream的write(int)方法,将一个int值写入流。
os.write(a);
System.out.println("通过OutputStream的write(int)方法写到流中为:"+os.toString()+"\n");

//OutputStream的write(int)方法的实现就是通过类型转换实现的,我自己转型和上面的结果对比一下。
byte b = (byte)a;
System.out.println("将测试十进制数直接转换为byte类型为:"+b);
System.out.println("将byte类型转换为字符类型为: "+(char)b+"\n");

//write(int)方法明确说明了,它是取二进制的低8位来实现取一个字节的,那么我就是取低8位,再转换成字符
String binaryStr = Integer.toBinaryString(a);
//打印二进制数
System.out.println("十进制数:"+ a +" 转换成二进制数为:"+binaryStr);
int x = binaryStr.length();
//取整数的低8位二进制:也就是将其转换为一个字节
int y = 0;
if(x%8>=0 && x%8<=7){
int n = x/8;
if(n>1)
y=(n-1)*8+x%8;
else if(n==0)
y=0;
else
y=x%8;
}
String substr = binaryStr.substring(y, x);
//打印低8位二进制
System.out.println("二进制的低8位为:"+substr);
//将低8位二进制转换成十进制并打印出来
System.out.println("将低8位的二进制数 转换成十进制数为:"+Integer.valueOf(substr, 2)+" 十进制转换成byte类型为:"+(byte)(Integer.valueOf(substr, 2)).intValue()+" byte类型转换成字符类型:"+(char)(byte)(Integer.valueOf(substr, 2)).intValue());
}
public static void main(String args[]) throws IOException{
Test6 t6 = new Test6();
int[] intArray = {-128,-127,-56,0,97,127,128,255,256,280};
for(int x : intArray){
t6.contrast(x);
System.out.println("______________________");
}
}
}

有看明白的,解说一下!
...全文
983 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangcb80 2015-05-02
  • 打赏
  • 举报
回复
还是没有人回答,自己顶一下
wangcb80 2015-04-23
  • 打赏
  • 举报
回复
我的疑问是:比如我们给write(int)传入一个-128,输出的字符无显示。 而直接接int = -128 窄化成 byte类型,再输出字符型是:タ 为什么直接调用对像的方法是无显示,一个通过自已类型转换就有显示出字符呢。而我看ByteBarrayOutputStream.write(int)的源码就是通过类型转换成byte来实现的呀。
rumlee 2015-04-23
  • 打赏
  • 举报
回复
ByteArrayOutputStream的write(int)方法虽然接收的是int类型参数,但是是按照byte类型来处理的。 这没什么奇怪的,所以如果你写的是一个超出了byte取值范围的int数字,则只会输出低8位字节

    public synchronized void write(int b) {
	int newcount = count + 1;
	if (newcount > buf.length) {
            buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
	}
	buf[count] = (byte)b;
	count = newcount;
    }
源码一看不就明白了吗?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧