黑马程序员技术交流社区

标题: 一个入学测试题 [打印本页]

作者: 毅心缘    时间: 2014-6-29 16:25
标题: 一个入学测试题
我个人觉得这个题是个坑,你们觉得呢?
  1. package com.itheima;

  2. /**
  3. * 定义一个文件输入流,
  4. * 调用read(byte[] b)方法将exercise.txt文件中的所有内容打印出来(byte数组的大小限制为5)。
  5. */

  6. /*
  7. * 思路:因为缓冲区数组固定是5个字节大小,
  8. *      而当文件中汉字时,汉字占2个字节,一次读取5个字节可能出现截取半个汉字的情况,所以不能急着打印;
  9. *      先分析一次读取后是否截取到了半个汉字,
  10. *      如果是,只打印前4个字节的内容,然后退回一个字节再读取,如果不是,直接输出;
  11. *      由此想到了利用随机访问文件流,可以设置当前指针位置,必要时回退一个字节。
  12. */

  13. import java.io.FileInputStream;
  14. import java.io.IOException;
  15. import java.io.FileInputStream;
  16. import java.io.RandomAccessFile;

  17. public class Test8 {

  18.         public static void main(String[] args) throws Exception {
  19.                
  20.                 // 创建一个读取流和文本相关联
  21.                 RandomAccessFile raf = new RandomAccessFile("c:\\exercise.txt", "r");
  22.                
  23.                 // 定义一个大小为5个字节的数组、存储读取到的字符
  24.                 byte[] buf = new byte[5];
  25.                 int len = 0;
  26.                 int currentPos = 0;
  27.                 while ((len = raf.read(buf)) != -1) {
  28.                         String str = new String(buf, 0, len);
  29.                         currentPos = currentPos + len;
  30.                         int i = 0;
  31.                         // i表示一个ASCII字符字节位置或一个汉字的第一个字节位置,汉字GBK编码的第一个字节都小于0
  32.                         while (i < 5) {
  33.                                 if (buf[i] < 0)
  34.                                         i = i + 2;
  35.                                 else
  36.                                         i = i + 1;
  37.                         }
  38.                         // read(buf)后,如果截取到了半个汉字,那buf[4]肯定是一个汉字的第一个字节,buf[4]<0,上面的i=6
  39.                         if (i == 6) {
  40.                                 // 截取了半个汉字时,应该退回到前一个位置,重新再读取5个字节
  41.                                 currentPos = currentPos - 1;
  42.                                 raf.seek(currentPos);
  43.                                 // 只把前4个字节的内容打印出来
  44.                                 System.out.print(str.substring(0, str.length() - 1));
  45.                         } else {
  46.                                 // 截取到完整汉字,整个输出
  47.                                 System.out.print(str);
  48.                         }
  49.                 }
  50.         }
  51. }
复制代码

作者: iWilliam    时间: 2014-6-29 16:33
{:3_53:}我来试试~
作者: iWilliam    时间: 2014-6-29 16:53
楼主的入学测试麽~还可以在优化优化的~至少+=,-=看上去更专业
作者: 黄梁梦想享    时间: 2014-6-29 17:00
不错不错
作者: yinxjfly    时间: 2014-6-29 19:32
楼主厉害!入学测试的题大都有几道题会有坑
作者: 七弦    时间: 2014-6-29 20:04
本帖最后由 七弦 于 2014-6-29 20:06 编辑

好幸运!
作者: blz01003hm    时间: 2014-6-29 20:57
我也觉得坑,
将exercise.txt文件中的所有内容打印出来,用字符流是最方便的,但他要你用字节流。
作者: 帅哥哥    时间: 2014-6-29 21:57
后面好像有个 “不考虑中文编码问题”
作者: itisdream    时间: 2014-6-29 22:28
有点点坑。。
作者: 夏季熬成了秋    时间: 2014-6-29 23:08
看看转转
作者: Alan_Kwan    时间: 2014-6-29 23:18
utf-8怎么办?
作者: SEPARATOR    时间: 2014-6-29 23:24
mark......
作者: 钟翠翠    时间: 2014-6-29 23:39
看来我还有好长一段路要走,飘过~~~~~
作者: 肥洋洋    时间: 2014-6-29 23:53
不管那文件里存的是什么,你用字节流读不就可以了。我也有这道题,用字节流,好像也没错...别想太复杂
作者: luheqi    时间: 2014-6-30 00:54
有坑是正常的。




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