package com.itheima;
import java.io.FileInputStream;
import java.io.IOException;
/**
* 第8题:
* 定义一个文件输入流,
* 调用read(byte[] b)方法将exercise.txt文件中的所有内容打印出来(byte数组的大小限制为5)。
*/
/*
* 思路:因为缓冲区数组固定是5个字节大小,
* 而当文件中汉字时,汉字占2个字节,一次读取5个字节可能出现截取半个汉字的情况,所以不能急着打印;
* 先分析一次读取后是否截取到了半个汉字,
* 如果是,只打印前4个字节的内容,然后退回一个字节再读取,如果不是,直接输出;
* 由此想到了利用随机访问文件流,可以设置当前指针位置,必要时回退一个字节。
*/
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);
}
}
}
}
黑马 汉子测试题。5个字节问题。
汉子编码问题。
最新推荐文章于 2024-05-13 11:34:02 发布