错题本:使用java读入流、输出流缓冲的小错误
下面这段代码
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; class Parcel7 { public static void main(String[] args) throws IOException { byte[] c = new byte[10]; BufferedInputStream bis = new BufferedInputStream(new FileInputStream( "in.txt")); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("out.txt ")); while ((bis.read(c)) != -1) { bos.write(c); } bos.flush(); bis.close(); bos.close(); } }
其中in.txt的内容是:
朝辞白帝彩云间。
身无彩凤双飞翼
结果输出到out.txt显示是:
朝辞白帝彩云间。
身无彩凤双飞翼彩凤双飞
问题的原因时你未将c的缓存清空,每次都是想out流中写入c的所有缓存。因为一个中文占两个字节,所以c中每次最多能存5个中文。
第一次读取10个字符是”朝辞白帝彩”
第二次读取“云间。\n身”,(其中\n表示的事换行符)
第三次读取”无彩凤双飞“,
第四次读取“翼”,但是c中剩下的8个字节存储的是第三次的“彩凤双飞”,即最后一次c中保存的是“翼彩凤双飞”,所以导致你多读取了四个字。修改为
int n = 0;
while((n = bis.read(c))!=-1){
bos.write(c, 0, n);// 每次从c的第0个字符开始到第n歌字符结束,n为每次读取的字符个数
}