`

字节流误区

阅读更多

1、字节流
误区:   被参数所迷惑
先来看一个普通的字节流
FileOutputStream fos = new FileOutputStream("d:\\testbit.txt");
看起方法
write(int b)
这里传入的是一个int,误以为是写入一个int
FileInputStream
read()方法,返回值是int,误以为是读取一个int

1)如果写入一个小于256的数,比如255,读取结果是255
2)如果写入大于255的数,比如256  ,读取的结果是0
查看文件的大小是1个字节
FileOutputStream fos = new FileOutputStream("d:\\testbit.txt");
   fos.write(256);
   fos.flush();
   fos.close();
FileInputStream fis = new FileInputStream("d:\\testbit.txt");
   int a =fis.read();
   System.out.println(a);

疑问:为什么传入一个int,int占四个字节,然后写入文件,文件大小只有1个字节,而且传入256,读取出来是0


注意:如果发现了上面的问题,那么以后使用就必须注意,不能再乱用字节流。

分析:由于写入一个int到文件,文件的大小只有1个字节,说明只写入了一个字节到文件中,但是int是占四个字节,00000000 00000000 00000000 00000000,那么说明计算机肯定进行了截图,其实在通过写入255,和256可以发现,其实该方法会截图int的最后一个字节写入文件,由于256的二进制是
00000000 00000000 00000001 00000000,最后一个字节大小是0,使用实质是往文件中写入了0。

总结:字节流,都是一个字节,一个字节的在进行读写,当然DataInputStream可以写入int,那么它是不是一下写入了四个字节呢,其实不是的
看他的writeInt();方法的源代码:
public final void writeInt(int v) throws IOException {
        out.write((v >>> 24) & 0xFF);
        out.write((v >>> 16) & 0xFF);
        out.write((v >>>  8) & 0xFF);
        out.write((v >>>  0) & 0xFF);
        incCount(4);
    }

写入一个int的时候,是写入了一个字节一个字节的写入,写了四次,通过观察可以方法,它是将int的四个字节,通过截图,将把每个字节写入,
再看readInt()方法源代码:
 public final int readInt() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        int ch3 = in.read();
        int ch4 = in.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
    }
读取的一个int的时候,读取出了四个字节,然后进行位移运算,再加在一起,这样一个int,经历了拆分到组装的过程,组装的过程需要根据拆分的过程来,这就是为什么输入流和输出流需要对应使用,如果输入流和输出流不一致,那么拆分和组装的方法就不一致,就不能将拆分后的还原了。

 

 

 


 

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics