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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 毅心缘 中级黑马   /  2014-6-29 16:25  /  1692 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我个人觉得这个题是个坑,你们觉得呢?
  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. }
复制代码

14 个回复

正序浏览
luheqi 来自手机 中级黑马 2014-6-30 00:54:40
14#
有坑是正常的。
回复 使用道具 举报
不管那文件里存的是什么,你用字节流读不就可以了。我也有这道题,用字节流,好像也没错...别想太复杂
回复 使用道具 举报
看来我还有好长一段路要走,飘过~~~~~
回复 使用道具 举报
mark......
回复 使用道具 举报
utf-8怎么办?
回复 使用道具 举报
看看转转
回复 使用道具 举报
有点点坑。。
回复 使用道具 举报
后面好像有个 “不考虑中文编码问题”
回复 使用道具 举报
我也觉得坑,
将exercise.txt文件中的所有内容打印出来,用字符流是最方便的,但他要你用字节流。
回复 使用道具 举报
本帖最后由 七弦 于 2014-6-29 20:06 编辑

好幸运!
回复 使用道具 举报
楼主厉害!入学测试的题大都有几道题会有坑
回复 使用道具 举报
不错不错
回复 使用道具 举报
楼主的入学测试麽~还可以在优化优化的~至少+=,-=看上去更专业
回复 使用道具 举报
{:3_53:}我来试试~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马