很简单的java读入流、输出流缓冲问题
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显示是:
朝辞白帝彩云间。
身无彩凤双飞翼彩凤双飞
1,求解释。
2,求避免此错误的方法。 展开
问题的原因时你未将c的缓存清空,每次都是想out流中写入c的所有缓存。
因为一个中文占两个字节,所以c中每次最多能存5个中文。
第一次读取10个字符是”朝辞白帝彩”
第二次读取“云间。\n身”,(其中\n表示的事换行符)
第三次读取”无彩凤双飞“,
第四次读取“翼”,但是c中剩下的8个字节存储的是第三次的“彩凤双飞”,即最后一次c中保存的是“翼彩凤双飞”,所以导致你多读取了四个字。
以下是修改方式:
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 ") );
int n = 0;
while((n = bis.read(c))!=-1){
bos.write(c, 0, n);// 每次从c的第0个字符开始到第n歌字符结束,n为每次读取的字符个数
}
bos.flush();
bis.close();
bos.close();
}
注:代码亲测通过
8 -->正常
11 -->不正常
朝辞白帝彩云间。
身无彩凤双飞翼?
12 -->不正常
朝辞白帝彩云间。
身无彩凤双飞翼无彩
13--->不正常
朝辞白帝彩云间。
身无彩凤双飞翼砦薏史?
15-->不正常
朝辞白帝彩云间。
身无彩凤双飞翼
身无彩凤双飞
1024-->>正常
2 把byte数设大,例如byte[] c = new byte[1024],可避免.
我没多打,输出结果就是这个,所以我才有疑问