A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁梦希 金牌黑马   /  2013-4-24 00:38  /  1664 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 袁梦希 于 2013-4-25 23:35 编辑

需求:我想把读取的文件的内容打印到控制台,定义缓冲数组,数组的大小限定为5个字节。
           还必须调用read(byte[] b)的方法,里面只能传缓冲数组。
省略了的main方法,代码如下:
  1. InputStream input = new FileInputStream("exercise.txt");

  2. OutputStream ops = new PrintStream(System.out, true, "UTF-8");

  3. int len = 0;
  4. byte[] buf = new byte[5];

  5. while((len = input.read(buf))!=-1){
  6. ops.write(buf, 0, len);
  7. }

  8. input.close();
  9. ops.close();
复制代码
提问:把exercise.txt文件中尽可能多放些数据(有汉子有英文)。以上代码执行后怎样解决乱码问题。想要代码实现。

评分

参与人数 1技术分 +2 收起 理由
张熙韬 + 2

查看全部评分

10 个回复

倒序浏览
为毛,缓冲数组那么小,大点不行啊,小了有什么意义。。
还有一点是你文件txt文本 本来什么格式,写的时候对应不就行了
回复 使用道具 举报
你存是用gb2312来存,而且你输出是用.OutputStream ops = new PrintStream(System.out, true, "UTF-8");,编码不对当然会出错啦

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
曹睿翔 发表于 2013-4-24 00:47
为毛,缓冲数组那么小,大点不行啊,小了有什么意义。。
还有一点是你文件txt文本 本来什么格式,写的时候 ...

亲 这是要求 缓冲数组被限制到5 要不然光读有足够大的缓冲区还有什么意思
回复 使用道具 举报
缓存不合理,改为这样:
  1. byte[] buf = new byte[1024];
复制代码
你每次缓存5个字节,汉字在U8编码中占3个或者4个字节,
也就是说有些汉字你是硬生生的给人家拆开来读写
肯定就会产生乱码嘛。

点评

V !  发表于 2013-5-26 15:14

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
肖川 发表于 2013-4-24 08:37
缓存不合理,改为这样:你每次缓存5个字节,汉字在U8编码中占3个或者4个字节,
也就是说有些汉字你是硬生生 ...

这是我的意思,嘿嘿,出题就是陷阱
回复 使用道具 举报
曹睿翔 发表于 2013-4-24 10:07
这是我的意思,嘿嘿,出题就是陷阱

好吧,被你发现了,你才是低调哥:lol
回复 使用道具 举报
江南雨 发表于 2013-4-24 07:53
你存是用gb2312来存,而且你输出是用.OutputStream ops = new PrintStream(System.out, true, "UTF-8");, ...

其实换成GBK也是一样,问题出在缓冲数组的大小
回复 使用道具 举报
袁梦希 发表于 2013-4-24 10:39
其实换成GBK也是一样,问题出在缓冲数组的大小

那把缓存数组增大后,输出的时候不用把编码改成和文件的保存方式一样吗?
回复 使用道具 举报
  1. public class Main
  2. {
  3.    public static void main(String[] args)throws Exception
  4.    {
  5. FileInputStream Fis = new FileInputStream("11.txt");

  6. int len = 0;
  7. byte[] buf = new byte[5];
  8. byte[] ans = new byte[10];
  9. while(len!=-1)
  10. {
  11.   len = Fis.read(buf);
  12.   if(len==-1)break;
  13.   int t = len;
  14.   for(int i=0;i<len;i++)
  15.   ans[i] = buf[i];
  16.   
  17.   len = Fis.read(buf);
  18.   if(len==-1)
  19.   {
  20.   System.out.println(new String(ans,0,t));
  21.   break;
  22.   }
  23.   
  24.   for(int i=0;i<len;i++)
  25.   ans[i+t] =buf[i];
  26.   System.out.println(new String(ans,0,t+len));
  27. }

  28.    }

  29. }
复制代码
我看看能不能捞个技术分...哈哈哈...

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马