package NIOTest;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Map;
import org.junit.Test;
/**
* 分散与聚集
* 分散读取(Scattering reads):将通道中数据分散到多个缓冲区
* 聚集写入(Gathering writer):将多个缓冲区的数据聚集到通道中
*
*/
public class ScatterTest {
public static void main(String[] args) {
test5();
}
public static void test() {
try {
RandomAccessFile raf=new RandomAccessFile("D:\\1.txt","rw");
//获取通道
FileChannel channel1=raf.getChannel();
//分配指定大小的缓冲区
ByteBuffer buf1=ByteBuffer.allocate(1024);
ByteBuffer buf2=ByteBuffer.allocate(1024);
//分散读取
ByteBuffer[] bufs= {buf1,buf2};
channel1.read(bufs);
for(ByteBuffer bytebuffer:bufs) {
bytebuffer.flip();//切换到读取数据的模式
}
System.out.println(new String(bufs[0].array(),0,bufs[0].limit()));
System.out.println(new String(bufs[0].array(),0,bufs[0].limit()));
System.out.println("----------------聚集写入--------------------------");
RandomAccessFile raf2=new RandomAccessFile("D:\\2.txt","rw");
FileChannel filechannel2=raf2.getChannel();
filechannel2.write(bufs);
channel1.close();
filechannel2.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 字符集 charset
* 编码:字符串--》字符数组
* 解码:字符数组--》字符串
*/
public static void charTest() {
Map<String,Charset> map=Charset.availableCharsets();
for(Map.Entry<String, Charset> entry:map.entrySet()) {
System.out.println(entry.getKey()+"="+entry.getValue());
}
}
public static void test5() {
Charset cs1=Charset.forName("GBK");
//获取编码器与解码器
CharsetEncoder ce=cs1.newEncoder();
//获取解码器
CharsetDecoder cd=cs1.newDecoder();
CharBuffer cBuf=CharBuffer.allocate(1024);
cBuf.put("钢铁侠");
cBuf.flip();
//编码
ByteBuffer bBuf;
try {
bBuf = ce.encode(cBuf);
for(int i=0;i<bBuf.limit();i++) {
System.out.println(bBuf.get());
}
//解码:
bBuf.flip();
CharBuffer cBuf2=cd.decode(bBuf);
System.out.println(cBuf2.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}