Um
造了个轮子,InputStreamReader 也是这样实现的。。。
读取文件应用了NIO的一些类。。。
主要时对ByteBuffer的一些操作
要点
1.CharsetDecoder
的decode public final CoderResult decode(ByteBuffer in, CharBuffer out, boolean endOfInput)
方法,其中boolean endOfInput
指定了是否后有后文。
2.ByteBuffer
的compact()
,将未get的数据放到开头,下一次写入是在其后添加新数据,
具体实现,将下标在[postion,limt)复制到开头,并将limt设置为postion
3.CharBufer
的clear()
public class ReadFile {
static final String encode = "UTF-8";
static final CharsetDecoder cd = Charset.forName(encode).newDecoder();
public static void main(String[] args) throws Exception {
FileChannel channel = new FileInputStream(new File("1.txt")).getChannel();
ByteBuffer buf = ByteBuffer.allocate(1024);
CharBuffer cBuf = CharBuffer.allocate(1024);
int bytesRead = channel.read(buf);
StringBuilder sb = new StringBuilder();
int length = 0;
while (bytesRead != -1) {
buf.flip();
//指定未完待续
cd.decode(buf, cBuf, false);
cBuf.flip();
length += cBuf.limit();
//打印出来
System.out.print(new String(cBuf.array(),0,cBuf.limit()));
cBuf.clear();
buf.compact();
bytesRead = channel.read(buf);
}
//文件包含的字符长度
System.out.println(length);
}
}