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,经历了拆分到组装的过程,组装的过程需要根据拆分的过程来,这就是为什么输入流和输出流需要对应使用,如果输入流和输出流不一致,那么拆分和组装的方法就不一致,就不能将拆分后的还原了。