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弥补不足。