我个人觉得这个题是个坑,你们觉得呢?
- package com.itheima;
- /**
- * 定义一个文件输入流,
- * 调用read(byte[] b)方法将exercise.txt文件中的所有内容打印出来(byte数组的大小限制为5)。
- */
- /*
- * 思路:因为缓冲区数组固定是5个字节大小,
- * 而当文件中汉字时,汉字占2个字节,一次读取5个字节可能出现截取半个汉字的情况,所以不能急着打印;
- * 先分析一次读取后是否截取到了半个汉字,
- * 如果是,只打印前4个字节的内容,然后退回一个字节再读取,如果不是,直接输出;
- * 由此想到了利用随机访问文件流,可以设置当前指针位置,必要时回退一个字节。
- */
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.FileInputStream;
- import java.io.RandomAccessFile;
- public class Test8 {
- public static void main(String[] args) throws Exception {
-
- // 创建一个读取流和文本相关联
- RandomAccessFile raf = new RandomAccessFile("c:\\exercise.txt", "r");
-
- // 定义一个大小为5个字节的数组、存储读取到的字符
- byte[] buf = new byte[5];
- int len = 0;
- int currentPos = 0;
- while ((len = raf.read(buf)) != -1) {
- String str = new String(buf, 0, len);
- currentPos = currentPos + len;
- int i = 0;
- // i表示一个ASCII字符字节位置或一个汉字的第一个字节位置,汉字GBK编码的第一个字节都小于0
- while (i < 5) {
- if (buf[i] < 0)
- i = i + 2;
- else
- i = i + 1;
- }
- // read(buf)后,如果截取到了半个汉字,那buf[4]肯定是一个汉字的第一个字节,buf[4]<0,上面的i=6
- if (i == 6) {
- // 截取了半个汉字时,应该退回到前一个位置,重新再读取5个字节
- currentPos = currentPos - 1;
- raf.seek(currentPos);
- // 只把前4个字节的内容打印出来
- System.out.print(str.substring(0, str.length() - 1));
- } else {
- // 截取到完整汉字,整个输出
- System.out.print(str);
- }
- }
- }
- }
复制代码 |
|