黑马程序员技术交流社区

标题: 【IO问题】来玩玩这题。急急急!! [打印本页]

作者: 袁梦希    时间: 2013-4-24 00:38
标题: 【IO问题】来玩玩这题。急急急!!
本帖最后由 袁梦希 于 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文件中尽可能多放些数据(有汉子有英文)。以上代码执行后怎样解决乱码问题。想要代码实现。


作者: 曹睿翔    时间: 2013-4-24 00:47
为毛,缓冲数组那么小,大点不行啊,小了有什么意义。。
还有一点是你文件txt文本 本来什么格式,写的时候对应不就行了
作者: 江南雨    时间: 2013-4-24 07:53
你存是用gb2312来存,而且你输出是用.OutputStream ops = new PrintStream(System.out, true, "UTF-8");,编码不对当然会出错啦


作者: 尹丽峰    时间: 2013-4-24 08:30
曹睿翔 发表于 2013-4-24 00:47
为毛,缓冲数组那么小,大点不行啊,小了有什么意义。。
还有一点是你文件txt文本 本来什么格式,写的时候 ...

亲 这是要求 缓冲数组被限制到5 要不然光读有足够大的缓冲区还有什么意思
作者: 肖川    时间: 2013-4-24 08:37
缓存不合理,改为这样:
  1. byte[] buf = new byte[1024];
复制代码
你每次缓存5个字节,汉字在U8编码中占3个或者4个字节,
也就是说有些汉字你是硬生生的给人家拆开来读写
肯定就会产生乱码嘛。
作者: 曹睿翔    时间: 2013-4-24 10:07
肖川 发表于 2013-4-24 08:37
缓存不合理,改为这样:你每次缓存5个字节,汉字在U8编码中占3个或者4个字节,
也就是说有些汉字你是硬生生 ...

这是我的意思,嘿嘿,出题就是陷阱
作者: 袁梦希    时间: 2013-4-24 10:30
曹睿翔 发表于 2013-4-24 10:07
这是我的意思,嘿嘿,出题就是陷阱

好吧,被你发现了,你才是低调哥:lol
作者: 袁梦希    时间: 2013-4-24 10:39
江南雨 发表于 2013-4-24 07:53
你存是用gb2312来存,而且你输出是用.OutputStream ops = new PrintStream(System.out, true, "UTF-8");, ...

其实换成GBK也是一样,问题出在缓冲数组的大小
作者: 江南雨    时间: 2013-4-24 17:11
袁梦希 发表于 2013-4-24 10:39
其实换成GBK也是一样,问题出在缓冲数组的大小

那把缓存数组增大后,输出的时候不用把编码改成和文件的保存方式一样吗?

作者: 刘胜寒    时间: 2013-4-25 18:12
  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. }
复制代码
我看看能不能捞个技术分...哈哈哈...
作者: 黄玉昆    时间: 2013-4-25 23:15
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2