错题本:使用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为每次读取的字符个数

      }

posted on 2013-04-21 15:56  monoid  阅读(172)  评论(0编辑  收藏  举报

导航