`
sharong
  • 浏览: 493357 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
D1667ae2-8cfc-3b68-ac7c-5e282789fa4a
论开源
浏览量:8720
7eb53364-fe48-371c-9623-887640be0185
Spring-data-j...
浏览量:13059
社区版块
存档分类
最新评论

利用JDK7的NIO2.0进行I/O读写和监视

阅读更多
最近在学习新的jdk 7提供的NIO 2.0,发现这个东东提供的java.nio.file包里的若干类,大大的方便了文件读写操作,而且编码相当简单,做了很好的封装。它的一个核心类就是Path。
下面就是windows系统下新增,删除,拷贝,move文件的简单示例,注意,需要JDK7的编译和运行环境
import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.jar.Attributes;

public class AIOOperator {
	
	/**
	 * 创建文件
	 * @throws IOException 
	 */
	public static void createFile() throws IOException {
		Path target = Paths.get("F:/study-copy.txt");
		Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-rw-rw-");
		FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);
		Files.createFile(target, attr);
	}
	
	/**
	 * 删除文件
	 * @throws IOException 
	 */
	public static void deleteFile() throws IOException {
		Path target = Paths.get("F:/study-copy.txt");
		Files.delete(target);		
	}
	
	/**
	 * 拷贝文件
	 * @throws IOException 
	 */
	public static void copyFile() throws IOException {
		Path source = Paths.get("F:/study-copy.txt");
		Path target = Paths.get("F:/study-copy2.txt");
		Files.copy(source, target, REPLACE_EXISTING);		
	}
	
	/**
	 * 移动文件
	 * @throws IOException 
	 */
	public static void moveFile() throws IOException {
		Path source = Paths.get("F:/study-copy.txt");
		Path target = Paths.get("d:/study-copy.txt");
		
		Files.move(source, target, REPLACE_EXISTING, COPY_ATTRIBUTES);		
	}
	
	public static void main(String[] args) {
		try {
			long start = System.currentTimeMillis();
			//createFile();
			//deleteFile();
			//copyFile();
			moveFile();
			
			long end = System.currentTimeMillis();
			System.out.println("consume -> " + (end - start));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

另外,在java.nio.file包中还提供了一套监视文件系统变更的WatchService API。可以使用这些API把一个目录注册到监视服务上。在注册的时候需要指定我们感兴趣的事件类型,比如文件创建、文件修改、文件删除等。当监视的事件发生时,监视服务会根据需要处理这些事件。
WatchService是一个接口,在不同的操作系统上有不同的实现,在Windows系统上,具体的实现为 sun.nio.fs.WindowsWatchService,在Linux平台上具体实现为sun.nio.fs.LinuxFileSystem。接着把一个或者若干个监视对象注册到监控服务上,任何实现Watchable接口的对象都可以注册。我们使用实现该接口的Path类来注册监控服务,Path 类实现了接口的register(WatchService, WatchEvent.Kind<?>...) 方法。在注册的时候需要指定想要监视的事件类型,所支持的事件类型如下:
ENTRY_CREATE:创建条目时返回的事件类型
ENTRY_DELETE:删除条目时返回的事件类型
ENTRY_MODIFY:修改条目时返回的事件类型
OVERFLOW:事件丢失或者被丢弃,不必要注册该事件类型

下面是具体的代码示例:
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
import static java.nio.file.StandardWatchEventKinds.OVERFLOW;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class MonitorDir {
	Map<WatchKey,Path> keys = new ConcurrentHashMap<WatchKey,Path>();
	private static WatchService watcher = null;
	
	static {
		try {
			watcher = FileSystems.getDefault().newWatchService();
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}	
	
	private void register(Path dir) throws IOException { // IOException ,InterruptedException{
		WatchKey key = dir.register(watcher, ENTRY_CREATE,ENTRY_DELETE,ENTRY_MODIFY); 
 
		 Path existing = keys.get(key); 
		 if (existing == null) { 
			 System.out.format("register: %s\n", dir); 
		 } else if (!dir.equals(existing)){  
			 System.out.format("update: %s -> %s\n",existing, dir); 
	     } 
		 
		 keys.put(key, dir); 
	}
	
	@SuppressWarnings("unchecked") 
	static <T> WatchEvent<Path> cast(WatchEvent<?> event) { 
	    return (WatchEvent<Path>)event; 
	} 

	private void monitor(Path dir) throws IOException,InterruptedException{		
		register(dir);
		
		// 等待监视事件发生
		WatchKey key = watcher.take();
			
		// System.out.println(key.getClass().getName());
		Path path = keys.get(key);
		if (path == null) {
			return;
		}
		
		for (WatchEvent<?> event : key.pollEvents()) {
			WatchEvent.Kind kind = event.kind();
			if (kind == OVERFLOW) {
				continue;
			}
			
			// 目录监视事件的上下文是文件名
			WatchEvent<Path> evt = cast(event);
			Path name = evt.context();
			Path child = path.resolve(name);
			System.out.format(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + "  %s|%s\n", event.kind().name(), child);
		}

		// 重置 key
		boolean valid = key.reset();
		if (!valid) {
			keys.remove(key);
			if (keys.isEmpty()) {
				return;
			}
		}
	}
		
	public static void main(String[] args) {
		MonitorDir monitorDir = new MonitorDir();
		
		Path dir = Paths.get("f:/monitortest");
		try {
			monitorDir.monitor(dir);
		} catch (IOException | InterruptedException e) {
			e.printStackTrace();
		}
	}
}
1
0
分享到:
评论
1 楼 albertit 2012-06-30  
毒德牛大学

相关推荐

    Pure JS (2): 热部署 (利用 JDK 7 NIO 监控文件变化)

    在这个场景中,开发者使用了JDK 7的非阻塞I/O(Non-blocking Input/Output,NIO)来监控文件系统的变化,从而实现当JavaScript源代码有变动时,即时更新到正在运行的项目中。 首先,我们需要理解热部署的核心价值。...

    JDK_7_NIO2

    ### JDK 7 NIO2 新特性详解 #### 引言 随着 Java 7 的发布,NIO (New I/O) 接口迎来了重要的更新,即 NIO.2 或称为 MNI (More New I/O)。NIO.2 增强了 Java 1.4 中的 NIO API,为开发人员提供了更为强大的 I/O ...

    maven-hibernate3-jdk14-2.0.jar

    maven-hibernate3-jdk14-2.0.jar

    IBM Java文档库 NIO 入门

    NIO弥补了传统I/O(基于java.io.*包)的不足,它通过定义包含数据的Buffer类和处理数据块的Channel接口,实现了无需本机代码就能进行低级优化的高效I/O。 教程内容涵盖了NIO库的高级概念和底层编程细节。首先,讲解...

    JAVA_NIO.zip_jdk

    I/O流或者输入/输出流指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口...原来的I/O库与NIO最重要的区别是数据打包和传输的方式的不同,原来的 I/O 以流 的方式处理数据,而 NIO 以块 的方式处理数据

    jdk6.0从入门到精通-----chapter5网络编程 新I/O(含源码下载)

    本章节我们将深入探讨JDK 6.0中的网络编程,特别是新I/O(New I/O,NIO)的特性,这部分内容在Chapter 5中进行了详尽的阐述。 网络编程是Java应用中的关键部分,它允许程序通过网络进行通信,如发送和接收数据。在...

    JDK8 64位 windows xp/7/8

    JDK8 64位 windows xp/7/8

    jdk1.6 源码 包含nio等

    在JDK 1.6中,NIO(New IO)是其重要的一个组成部分,提供了非阻塞I/O操作,对于高性能网络应用和大数据处理有着显著的优势。 NIO,全称为“New Input/Output”,是Java在1.4版本引入的一种新的I/O模型,与传统的...

    java-NIO-入门教程.docx

    Java NIO(New I/O)是 Java 语言中的一种新的输入/输出机制,自 JDK 1.4 开始引入。不同于传统的面向流的 I/O,NIO 采用面向块的 I/O 方式,提供了高速的 I/O 操作。NIO 库的主要特点是使用缓冲区和通道来处理数据...

    JDK7新特性(完整篇)

    4. **JDK7新特性&lt;四&gt; NIO2.0 文件系统** NIO2(非阻塞I/O的第二版)带来了全新的文件系统接口,包括Path API、WatchService API等,提供了异步文件操作和文件事件监听的能力,极大地提升了文件操作的灵活性和性能。...

    新输入输出NIO

    在JDK 1.4之后,原始的I/O包(java.io.*)已经与NIO进行了很好的集成,很多类都支持块I/O,使得混合使用流和块I/O成为可能。 总的来说,新输入输出(NIO)为Java程序员提供了更高效、灵活的I/O操作手段,特别是对于...

    aspectwerkz-jdk14-2.0.jar.zip

    在实际使用"aspectwerkz-jdk14-2.0.jar"时,开发者可能会将其添加到他们的项目类路径中,以便利用AspectWerkz提供的AOP特性。AspectWerkz支持如方法拦截、事务管理、日志记录等切面,它使用一种称为"advise"的机制来...

    Java-NIO2教程

    - **JDK1.7至今**: 随着Java 7的发布,NIO2(New I/O version 2)作为JSR-203的一部分被引入。NIO2提供了一套新的API,支持更为高效的异步I/O操作,并且引入了强大的文件系统API,包括`Path`、`Files`等类,使得文件...

    aspectwerkz-jdk5-2.0.jar

    aspectwerkz-jdk5-2.0.jar

    aspectwerkz-jdk14-2.0.jar

    aspectwerkz-jdk14-2.0.jar

    Java IO, NIO and NIO.2

    Java NIO(New Input/Output)是Java在JDK 1.4中引入的新I/O机制,旨在提高I/O操作的性能。NIO基于缓冲区(Buffers)、通道(Channels)、选择器(Selectors)等概念。 缓冲区是NIO中一个核心概念,它是一个对象,...

    nio入门 IBM教材,pdf格式

    - **NIO 的起源**:NIO(New Input/Output)库是在 JDK 1.4 中引入的,旨在解决传统 Java I/O 操作的局限性和性能瓶颈。 - **改进目标**:NIO 通过提供高速的、面向块的 I/O 改进了原有的 I/O 包。通过块处理而不是...

Global site tag (gtag.js) - Google Analytics