很简单的java读入流、输出流缓冲问题

下面这段代码publicstaticvoidmain(String[]args)throwsIOException{byte[]c=newbyte[10];Buffere... 下面这段代码
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,求避免此错误的方法。
展开
 我来答
百度网友b68266c
2013-04-11 · 超过11用户采纳过TA的回答
知道答主
回答量:29
采纳率:0%
帮助的人:19.5万
展开全部

  问题的原因时你未将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();

  }


  • 注:代码亲测通过

monical2
2013-04-11 · TA获得超过772个赞
知道小有建树答主
回答量:730
采纳率:60%
帮助的人:393万
展开全部
1 原因在于byte[] c = new byte[10] ,10个字节 太小了.eclipse里一个汉字占两个字节,"。"也是两个字节,bis.read(c) 每十个字节读啊读,
8 -->正常
11 -->不正常
朝辞白帝彩云间。
身无彩凤双飞翼?
12 -->不正常
朝辞白帝彩云间。
身无彩凤双飞翼无彩
13--->不正常
朝辞白帝彩云间。
身无彩凤双飞翼砦薏史?

15-->不正常
朝辞白帝彩云间。
身无彩凤双飞翼
身无彩凤双飞

1024-->>正常

2 把byte数设大,例如byte[] c = new byte[1024],可避免.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
聪明的煤球8C
2013-04-11
知道答主
回答量:26
采纳率:0%
帮助的人:13.5万
展开全部
你多打了几个字
追问
我没多打,输出结果就是这个,所以我才有疑问
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式