JAVA IO (长期更新)

来源:互联网 发布:淘宝客助手免费版 编辑:程序博客网 时间:2024/05/01 23:30

1.OutputStream 类

1.1 void write(int b) 方法
本来应该是接受一个无符号的1个字节的整数(0-255).
接受 Int型数据,但是java内部其实会将b 转换成0-255之间的数字,原因是Stream是以字节为读取单位的. 具体规则如下: b=b& 0x000000FF
然后将结果看做是无符号1字节整型处理。Java内部用补码来表示正数和负数。
首先针对正数来说:正数的补码是他本身。故直接截取后8位,当做无符号二进制整数处理即可。
针对负数来说:Java中用补码来表示负数。所以举个例子 :-130 :将-130的绝对值表示成4个字节的有符号类型 0000 0000 0000 0000 0000 0000 1000 0010 ,然后取反码加一 得:
1111 1111 1111 1111 1111 1111 0111 1110 ,然后截取后八位,便是126.
write()方法仅仅是传送一个位模式 ,但是这个位模式如何解释,例如可以将他对应到ascii码中,然后打印出来,这个取决于OutputStream的子类处理,举个例子,如果使用System.out ,那么就是将这个位模式就解释成ascii码,对于无法打印出来的ascii码,java会输出乱码

    public static void main(String[] args) throws Exception{        System.out.write(-130);        System.out.flush();    }    //输出结果为~ ,表示的是ascii码中的126对应的字符

1.2 write(byte[] data) throws IOException
write(byte[] data ,int offset,int length) throws IOException
显然这里使用byte表示一个字节,但是和write(int b) 方法类似,希望接受无符号1字节整数,所以java内部也会将byte转换成无符号类型, 具体的公式如下:
int unsignedByte = signedByte >= 0 ? signedByte : 256 + signedByte;
突然发现对于Java来说,虽然只有简单的集中primitive 数据类型,但是内部还是要进行一系列的转换。

  1. dataoutputStream和datainputstream
    2.1 write integer
    void writeByte(int b);
    void writeShort(int s);
    void writeInt(int i);
    void writeLong(long l);
    首先需要搞明白从int转换成byte,和short的原理,
    当int转换成byte时, 首先令
int byteValue;int temp = intValue % 256;if ( intValue < 0) {byteValue = temp < -128 ? 256 + temp : temp;}else {byteValue = temp > 127 ? temp - 256 : temp;}

首先先模256,相当于取低8位,但是,注意如果intValue是负数,先取绝对值,然后模256,然后加上负号,因此结果在-255~255之间,判断余数是否在-128~127之间,如果不在此区间,然后想个办法映射到此区间
byteValue = temp < -128 ? 256 + temp : temp;
byteValue = temp > 127 ? temp - 256 : temp;
注意这个和outputSteam中的write(int b) 中处理b的方法不大一样,如果b不在0~255之间,那么是取后8位,注意这里是没有符号的,原因就是处理的就是无符号单字节。这里讲int转换成byte,是转换成有符号单字节。
因此

void writeByte(int b);void writeShort(int s);void writeInt(int i); 

这三个方法首先将int转变成byte,short,int,然后使用two’complement ,big-endian 转变成二进制。如果写入到文件,注意是二进制文件,直接用文本编辑器打开是不会显示相应的数字的,而是16进制的表示。

2.2 Strings 和 chars
2.2.1 write

public final void writeChar(int c) throwsIOExceptionpublic final void writeChars(String s) throws IOExceptionpublic final void writeBytes(String s) throws IOExceptionpublic final void writeUTF(String s) throws IOException 

第一个方法,将c转变成无符号二字节,进行写操作.
第二个方法逐个读取字符,转换成无符号二字节,进行写操作。
第三个方法逐个读取字符,转换成无符号单字节,进行写操作。
第四个方法逐个读取字节,转换成无符号二字节,然后转换使用UTF-8进行编码,比如汉字,可能编码成3个字节
2.2.2 read (这些方法不好)
尽量不要使用datainputStream读取文本,比如读取字符,或者字符串。

原创粉丝点击