package cn.luxh.app;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import org.junit.Test;
public class NioTester {
    
    /
      读取文件
      获取通道;创建缓冲区;让通道将数据读到这个缓冲区中。
     /
    @Test
    public void testRead() {
        FileInputStream fis = null;
        FileChannel channel = null;
        try {
            //获取通道Channel,从FileInputStream中获取
            fis = new FileInputStream(D:/test.rar);
            channel = fis.getChannel();
            
            //创建缓冲区
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            
            //将数据从通道读取到缓冲区
            channel.read(buffer);
            
            //营业处理惩罚
            //...
            
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(fis != null) {
                    fis.close();
                }
                if(channel != null) {
                    channel.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
    }
    
    /
      写文件
      获取通道;创建一个缓冲区,用数据填充它;然后让通道用这些数据来履行写入操纵。 
     /
    @Test
    public void testWrite() {
        FileOutputStream fos = null;
        FileChannel channel = null;
        try {
            //获取通道,从FileOutputStream获取
            fos = new FileOutputStream(D:/test.txt);
            channel = fos.getChannel();
            
            //创建缓冲区
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            
            String words = hey,girl.I am a coder.;
            byte[] message = words.getBytes(Charset.defaultCharset());
            buffer.put(message);
            buffer.flip();
            channel.write(buffer);
        }catch(IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(fos != null) {
                    fos.close();
                }
                if(channel != null) {
                    channel.close();
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
    
    /
      读写操纵
      获取通道;创建一个 Buffer,然后从源文件中将数据读到这个缓冲区中;
      然后将缓冲区写入目标文件。
      络续反复 读写 直到源文件停止。
     /
    @Test
    public void testReadAndWrite() {
        FileInputStream fis = null;
        FileChannel inChannel = null;
        
        FileOutputStream fos = null;
        FileChannel outChannel = null;
        
        try {
            fis = new FileInputStream(D:/test.txt);
            inChannel = fis.getChannel();
            
            fos = new FileOutputStream(D:/test2.txt);
            outChannel = fos.getChannel();
            
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while(true) {
                //重设缓冲区,使它可以接管读入的数据。
                buffer.clear();
                if(inChannel.read(buffer)==-1) {
                    break;
                }
                //让缓冲区可以将新读入的数据写入通道
                buffer.flip();
                outChannel.write(buffer);
            }
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(fos != null) {
                    fos.close();
                }
                if(outChannel != null) {
                    outChannel.close();
                }
                if(fis != null) {
                    fis.close();
                }
                if(inChannel != null) {
                    inChannel.close();
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}