Java Network Programming----byte

2018-07-09  本文已影响0人  superuni

InputStream接口的通常用法如下:

InputStream in = ...省略初始化

byte[] input = new byte[10];

for (int i = 0; i < input.length; i++) {

    int b = in.read();

    if (b == -1) break;

    input[i] = (byte) b;

}

OutputStream os = ...省略初始化

os.write(input);//public void write(byte[] data) throws IOException

一个字节字节的读,但是由于InputStream读出来的是int类型,最终OutputStream需要输出的却是byte[]类型的参数,这样会导致数据类型的完整性的却是--int是8位,byte是2位。而且Inputstream读出来的int其实是unsigned的byte,即0到255,但是java没有unsigned类型,signed byte的范围是-128到127,导致的结果就是int在大于2127时转换成byte会变成负数,即丢失二进制的前4位:

int a =128;

byte b = (byte) a;

System.out.println(b);//-128

如果不注意这点的话,IO流的读写就会出现差错。解决方法很简单,抵消掉多余的负数即可:

System.out.println(b >= 0? b : b +256);//128

或者是调用write(int b),由于一个个写性能很差,需要BufferedOutputStream弥补不足。

上一篇下一篇

猜你喜欢

热点阅读