Java 基础(IO流 类的常用方法)续

Buffer类的常用方法

capacity():int返回Buffer的容量大小

hasRemaining():boolean判断是否还有元素可以进行处理

remaining():int返回当前位置和界限之间的元素个数;

position():int 返回当前操作位置

mark():Buffer设置Buffer的标记位置,只能在0和position之间做标记

reset():Buffer将位置position转到mark所在的位置

rewind():Buffer将位置position设置到0,取消设置的mark

put(obj)用于向Buffer中放入数据

get()用于从Buffer中取出数据

CharBuffer buffer = CharBuffer.allocate(10);
System.out.println(buffer.capacity()); // 获取buffer的容积值
capacity=10,position=0,limit=10
System.out.println(buffer.position());
System.out.println(buffer.limit());
buffer.put('中');
System.out.println(buffer.capacity()); // 10
System.out.println(buffer.position()); // 1
System.out.println(buffer.limit()); // 10
String ss="中国人民解放军";
for(int i=0;i<ss.length();i++)
buffer.put(ss.charAt(i));
buffer.flip(); // 将limit设置到position,并且把position设置为0。相当于是将buffer中
没有数据的存储位置封印起来,从而避免读取时读到不合法的数据
System.out.println(buffer.capacity()); // 10
System.out.println(buffer.position()); // 0
System.out.println(buffer.limit()); //7
char cc=buffer.get();//获取position对应的字符
System.out.println(cc); //中
System.out.println(buffer.capacity()); // 10
System.out.println(buffer.position()); // 1
System.out.println(buffer.limit()); //7
buffer.clear(); //清空buffer中的数据,并重置position和limit
System.out.println(buffer.capacity()); // 10
System.out.println(buffer.position()); // 0
System.out.println(buffer.limit()); //10
ss="中国人民解放军";
for(int i=0;i<ss.length();i++)
buffer.put(ss.charAt(i));
cc=buffer.get(2); //按照下标位置获取对应的数据,并不会操作position
System.out.println(cc);
System.out.println(buffer.position()); //7

Channel类的常用方法

Channel可以直接将文件的部分或者全部直接映射成Buffer

注意:不能直接访问Channel中的数据,包括读取、写入都不行。Channel只能与Buffer进行交互

所有Channel不应该通过构造器来直接创建,而是通过传统的节点InputStream、OutputStream 的getChannel方法来返回对应的Channel

常用的是FileInputStream、FileOutputStream的getChannel()返回的FileChannel

Channel中最常用的三个方法是map()、read()和write()

File file = new File("T1.java");
FileChannel inChannel = new FileInputStream(file).getChannel();
ByteBuffer buffer = ByteBuffer.allocate(256);
while (inChannel.read(buffer) != -1) {//多次读取数据的方式从文件中获取内容
buffer.flip(); //将没有数据的区域封印起来
Charset charset = Charset.forName("GBK");//使用GBK的字符集创建解码器
CharsetDecoder decoder = charset.newDecoder();
CharBuffer cb = decoder.decode(buffer);//使用解码器将ByteBuffer转换为
CharBuffer
System.out.println(cb);
buffer.clear();//将position设置为0,为下一次读取数据做准备
}

map()方法将Channel对应的部分或全部数据映射成ByteBuffer

File f = new File("T1.java");
FileChannel in = new FileInputStream(f).getChannel();
FileChannel out = new FileOutputStream("a.txt").getChannel();
MappedByteBuffer buffer = in.map(FileChannel.MapMode.READ_ONLY, 0,
f.length());//参数1为执行映射时的模式,有只读、读写模式;参数2和3用于设置哪些数据执行映
射。可以将FileChannel中全部数据映射为ByteBuffer
out.write(buffer);
buffer.clear();
Charset charset = Charset.forName("GBK");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer cb = decoder.decode(buffer);
System.out.println(cb);

selector

是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel通道的状态是否处于可读、可写。如 此可以实现单线程管理多个channels也就是可以管理多个网络链接。

使用Selector的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上 下文切换带来的开销

        FileChannel不能切换为非阻塞模式,更准确的来说是因为FileChannel没有继承 SelectableChannel

        多用于网络应用编程中

基本用法

Selector的创建。通过调用Selector.open()方法创建一个Selector对象

注册Channel到Selector                Channel必须是非阻塞的。

轮询方式获取选择器上的状态值

Chatset字符集

所有文件在底层都是二进制文件,字符文件是系统将底层的二进制序列转换为字符,这里会涉及编码 Encoder和解码Decoder

        将明文的字符序列转换为计算机理解的二进制序列称为编码

Charset类

availableCharsets():SortedMap 获取当前JDK所支持的所有字符集

字符串别名

        GBK简体中文

        ISO-8859-1拉丁文

        UTF-8是8位UCS转换格式

        Java7新增StandardCharsets类,其中包含了ISO_8859_1、UTF_8、UTF-16等类变量,这些类变量 代表了最常见的字符集对应的Charset对象

        newDecoder():CharsetDecoder获取该编码字符集对应的解码器

                decode(ByteBuffer):CharBuffer方法可以将字节序列ByteBuffer转换为CharBuffer字符序列

        newEncoder():CharsetEncoder获取该编码字符集对应的编码器

                encode(CharBuffer):ByteBuffer方法可以将字符序列CharBuffer转换为ByteBuffer字节序列

Charset c1 = Charset.forName("GBK");
CharsetEncoder encoder = c1.newEncoder();
CharsetDecoder decoder = c1.newDecoder();
CharBuffer cb = CharBuffer.allocate(8);
cb.put('孙');
cb.put('误');
cb.put('空');
cb.flip();
ByteBuffer bb=encoder.encode(cb);//将CharBuffer转换为ByteBuffer
for(int i=0;i<6;i++) {
System.out.println(bb.get(i)+" ");
}
System.out.println("====================");
System.out.println(decoder.decode(bb));//将byteBuffer转换为charBuffer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值