NIO

1.文件复制

package com.run.learn;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
/**
 * 可以使用System类的getProperties()方法来访问本地系统的文件编码格式,文件编码格式的属性名为file.encoding
 *
 */
public class NioLearn {
    public static void main(String[] args) {
        File f = new File("E:\\ElsFk.java");
        try(FileChannel inChannel = new FileInputStream(f).getChannel();
                FileChannel outChannel = new FileOutputStream("E:\\a.txt").getChannel();
        ){
            //將FileChannel里的全部映射成byteBuffer
            MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, f.length());
            //使用GBK的字符集来创建解码器
            Charset charset = Charset.forName("GBK");
            //直接将buffer中的数据全部输出
            outChannel.write(buffer); 
            //复原limit,position的位置
            buffer.clear();
            //创建解码器对象
            CharsetDecoder decoder = charset.newDecoder();
            //使用编码器将ByteBuffer转换成CharBuffer
            CharBuffer charBuffer = decoder.decode(buffer);
            System.out.println(charBuffer);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
2.使用FileVisitor遍历文件和目录
files工具类提供了两个方法来遍历文件和子目录
walkFileTree(Path start,FileVistor<? super Path> visitor):遍历start路径下的所有文件和子目录
walkFileTree(Path start, Set<FileVisitOption> options,int maxDepth , FileVisitor<? super Paht> visitor):与上一个方法的功能类似,该方法最多遍历maxDepth深度的文件。
 
实际编程没必要为FileVistor的4个方法都提供实现,可以通过继承SimpleFileVisitor(FileVistor的实现类)
3.WatchService监听文件变化
package com.run.learn;

import java.nio.file.FileSystems;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class AboutWatch {
	public static void main(String[] args) {
		try {
			//获取文件系统的WatchService对象
			WatchService ws = FileSystems.getDefault().newWatchService();
			//为C盘根路径注册监听
			Paths.get("C:/").register(ws, StandardWatchEventKinds.ENTRY_CREATE
					,StandardWatchEventKinds.ENTRY_MODIFY
					,StandardWatchEventKinds.ENTRY_DELETE);
			while(true){
				//获取下一个文件变化事件
				WatchKey key = ws.take();
				for (WatchEvent<?> event : key.pollEvents()) {
					System.out.println(event.context() + "文件发送了" + event.kind()+"事件!");
				}
				//重设WatchKey
				boolean valid = key.reset();
				//如果重设失败,退出监听
				if(!valid){
					break;
				}
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}

 

posted @ 2017-06-12 10:08  judy999  阅读(153)  评论(0编辑  收藏  举报