`

[java]nio.2 java.nio.file.*使用初探

 
阅读更多

内容参考了:

http://zjumty.iteye.com/blog/1896350

当做一个练习然后加上自己的想法吧:

 

集合在了java.nio.file下的一些类的使用

 

 

Path:

使用Paths这个工具类可以生成Path

代表地址 这个类主要处理一些地址的生成操作 比如在已有Path下得到子文件的地址 得到文件的相对地址等等,使用起来很简单,这边列几个方法(更多的可以参考链接里的地址):

package test.nio;

import java.nio.file.Path;
import java.nio.file.Paths;

public class PathTest {

	public static void main(String[] args) {
		Path file=Paths.get("G:", "新建文件夹");
		System.out.format("file:%s \n", file);
		
		//是否以所给的字符或者Path结尾(这边不写 新建文件夹 的会是false)
		System.out.println(file.endsWith("新建文件夹"));

		//在当前path下增加 输出:G:\新建文件夹\abc.txt 
		Path file2=file.resolve("abc.txt");
		System.out.format("file2:%s \n",file2);
		
		//在当前path所在的目录中增加 输出:G:\新建文件夹\1 
		Path file3=file2.resolveSibling("1");
		System.out.format("file3:%s \n",file3);
		
		// 相对路径 输出:..\1 file3相对于file2的路径
		Path file4=file2.relativize(file3);
		System.out.format("file4:%s \n",file4);
		
		// 获取名字数量 输出都为:2
		System.out.format("file3 namecount:%d \n",file3.getNameCount());
		System.out.format("file4 namecount:%d \n",file4.getNameCount());
		
		// 输出新建文件夹
		System.out.format("file3 getName(0):%s \n",file3.getName(0));
		
		// 返回G:\  G:\新建文件夹\1 可见nameCount只记录 新建文件夹 和 1 G:\需要通过getRoot获取
		System.out.format("file3 getRoot():%s \n",file3.getRoot());
		// 相对路径没有root 返回null 并且 ..\1  他的namecount记录的就是 ..和1
		System.out.format("file4 getRoot():%s \n",file4.getRoot());
		
		
	}

}

 

 

 

File Attriubute:

通过工具类Files获取

属性相关的类是 java.nio.file.attribute

 


BasicFileAttribute还有个BasicFileAttributeView

而这个View类里面只有三个方法:


 其中一个还是返回那个BasicFileAttributes的....
似乎这个View类唯一的功能就是改下修改时间了....而其他View类也提供一些修改的操作

(这里有些讨论:http://stackoverflow.com/questions/16374278/basicfileattributes-vs-basicfileattributeview-in-java)

可以理解成BasicFileAttribute就是存放相关数据 而对应的view类不仅可以取出数据还可以对数据进行修改

package test.nio;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;

public class FileAttribute {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		Path file=Paths.get("G:", "新建文件夹","abc.txt");
        BasicFileAttributeView bav=Files.getFileAttributeView(file, BasicFileAttributeView.class);
        
        BasicFileAttributes ba=bav.readAttributes();
        //或者:
        //BasicFileAttributes ba=Files.readAttributes(file, BasicFileAttributes.class);
        System.out.format("File size: %s \n" , ba.size());  
        System.out.format("File creation time: %s \n" , ba.creationTime());  
        System.out.format("File was last accessed at: %s \n" , ba.lastAccessTime());  
        System.out.format("File was last modified at: %s \n" , ba.lastModifiedTime());  
        System.out.format("Is directory? %s \n" , ba.isDirectory());  
        System.out.format("Is regular file? %s \n" , ba.isRegularFile());  
        System.out.format("Is symbolic link? %s \n" , ba.isSymbolicLink());  
        System.out.format("Is other? %s \n" , ba.isOther());  
	}

}
结果 
File size: 0
File creation time: 2013-07-24T08:36:50.93237Z
File was last accessed at: 2013-07-24T08:36:50.93237Z
File was last modified at: 2013-07-24T08:36:50.93237Z
Is directory? false
Is regular file? true
Is symbolic link? false
Is other? false

 

 

 

 

 

读取整个目录的文件:

用DirectoryStream这个类就可以完成

诸如:

DirectoryStream<Path> ds=Files.newDirectoryStream(file, "*")

 的形式 其中第一个参数是Path ,第二个参数是String(还有其他的重载方法)

第二个参数可以是通配符 有很多种的书写方式(详细的可以看FileSystem的getPath() http://openjdk.java.net/projects/nio/javadoc/java/nio/file/FileSystem.html#getPathMatcher(java.lang.String))

以上文档中有一个在win7下C:\\也可以写成C:/ 试验了下没问题

package test.nio;

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

public class DirectoryStreamTest {

	public static void main(String[] args) throws IOException {
		Path file=Paths.get("G:/新建文件夹");
        try(DirectoryStream<Path> ds=Files.newDirectoryStream(file, "*")){
        	for(Path p:ds){
        		System.out.format("file name :%s \n",p);
        	}
        }
	}

}

 

...先写到这..等等再写

 

 

--接着写点:

FileVisitor使用:

代码如下 使用了FileVistor并覆写了所有的方法

也可以使用SimpleFileVistor来选择需要的方法:

package test.nio;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;

public class FileVistorTest {

	public static void main(String[] args) throws IOException {
		Path file=Paths.get("G:/","新建文件夹");
		Files.walkFileTree(file, new FileVisitor<Path>(){
		    @Override
		    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
		        throws IOException
		    {
		        System.out.format("visit file %s \n",file);
		        return FileVisitResult.CONTINUE;
		    }

			@Override
			public FileVisitResult preVisitDirectory(Path dir,
					BasicFileAttributes attrs) throws IOException {
				 System.out.format("preVisitDirectory %s \n",dir);
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult visitFileFailed(Path file, IOException exc)
					throws IOException {
				 System.out.format("visitFileFailed %s \n",file);
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult postVisitDirectory(Path dir, IOException exc)
					throws IOException {
				System.out.format("postVisitDirectory %s \n",dir);
				return FileVisitResult.CONTINUE;
			}
		});

	}

}
输出 :
preVisitDirectory G:\新建文件夹
preVisitDirectory G:\新建文件夹\1
postVisitDirectory G:\新建文件夹\1
visit file G:\新建文件夹\abc.txt
visit file G:\新建文件夹\autorun.inf
preVisitDirectory G:\新建文件夹\cc
visit file G:\新建文件夹\cc\c01.txt
visit file G:\新建文件夹\cc\c02.txt
postVisitDirectory G:\新建文件夹\cc
visit file G:\新建文件夹\h.ico
postVisitDirectory G:\新建文件夹

 根据方法名和输出很容易就可以知道是什么意思

需要注意的是:FileVisitResult 他是一个枚举类型 每个枚举值意思如下:

public enum FileVisitResult {
    /**
     * Continue. When returned from a {@link FileVisitor#preVisitDirectory
     * preVisitDirectory} method then the entries in the directory should also
     * be visited.
     * 在preVisitDirectory方法返回的话 目录下的文件(或目录)也会被被访问
     */
    CONTINUE,
    /**
     * Terminate. 结束
     */
    TERMINATE,
    /**
     * Continue without visiting the entries in this directory. This result
     * is only meaningful when returned from the {@link
     * FileVisitor#preVisitDirectory preVisitDirectory} method; otherwise
     * this result type is the same as returning {@link #CONTINUE}.
     * 只在preVistiDirectory这个方法中返回有意义 跳过目录下的文件
     */
    SKIP_SUBTREE,
    /**
     * Continue without visiting the <em>siblings</em> of this file or directory.
     * If returned from the {@link FileVisitor#preVisitDirectory
     * preVisitDirectory} method then the entries in the directory are also
     * skipped and the {@link FileVisitor#postVisitDirectory postVisitDirectory}
     * method is not invoked.
     * 跳过同一层目录的 如果在preVisitDirectory里使用 那么    postVisitDiretory这个方法就不会被触发
     */
    SKIP_SIBLINGS;
}

 

Watch Service API 

这个IBM-developer有个很好的示例 这边就不在多说了

http://www.ibm.com/developerworks/cn/java/j-lo-nio2fs/

  • 大小: 13.4 KB
  • 大小: 17.6 KB
分享到:
评论

相关推荐

    java NIO.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...

    Java.NIO资源下载资源下载

    例如,书中提到了使用 Java NIO 可以提高应用程序的响应性、可扩展性和可靠性等。 ### Java NIO API 与旧版 I/O API 的关系 值得注意的是,Java NIO API 是对旧版 I/O API 的补充而非替代。这意味着开发者需要了解...

    Java NIO 中英文版 + Pro Java 7 NIO.2

    `Pro Java 7 NIO.2`这本书由Anghel Leonard著,深入探讨了Java NIO.2 API,这是Java 7引入的进一步扩展,包括: 1. **文件系统API增强**:新增了AsynchronousFileChannel,支持异步文件操作,可以在后台线程中执行...

    java nio.pdf

    java nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava ...

    优雅的操作文件:java.nio.file 库介绍.pdf

    例如,你可以使用Glob语法(如`**/*.txt`)或正则表达式来查找特定类型的文件。 ### 总结 `java.nio.file`库的引入使得Java在文件操作方面有了质的飞跃,它简化了API,提高了性能,并提供了更多现代文件系统所需的...

    java NIO详细教程

    ### Java NIO 详细教程知识点解析 #### 一、Java NIO 概述 Java NIO(New IO)是Java平台提供的一种新的IO操作模式,它首次出现在Java 1.4版本中,并在后续版本中不断完善。Java NIO 的设计目的是为了克服传统Java ...

    java常用的工具类整理28个

    7. **java.nio.file.***(Java 7及以上):非阻塞I/O框架,包括`Path`、`Files`、`FileSystem`等,提供了更高效的文件操作。 8. **java.io.BufferedReader**和**java.io.BufferedWriter**:用于读写文本文件时的...

    java-nio.rar_NIO_java nio

    - `java.nio.file.Paths` 和 `Files` 类:提供文件操作的NIO接口,如读写文件、获取文件属性等。 5. **NIO在连接池中的应用** - **创建服务器端**:使用`AsynchronousServerSocketChannel`创建监听通道,接受...

    Java NIO.pdf

    Java NIO.pdf nio教程 Java NIO.pdf nio教程 java nio

    The_Study_about_Java.nio.rar_java nio

    Java NIO,全称为New Input/Output,是Java在1.4版本引入的一个新的I/O API,用于替代标准的Java IO API。这个新的API提供了一种不同于传统阻塞I/O模型的非阻塞I/O处理方式,使得在处理高并发、大数据传输场景时性能...

    Java IO, NIO and NIO.2

    Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...

    JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现

    JDK1.7 之 java.nio.file.Files 读取文件仅需一行代码实现 java.nio.file.Files 类是 JDK1.7 中引入的新的文件操作类,该类包含了许多有用的方法来操作文件。其中,Files.readAllBytes(Path) 方法可以将整个文件...

    JavaNIO.zip_java nio_nio java

    下面是一些关键的Java NIO使用示例: 1. **读取文件**:使用FileChannel从文件中读取数据到缓冲区,然后从缓冲区获取数据。 ```java FileInputStream fis = new FileInputStream("file.txt"); FileChannel channel ...

    Apress.Pro.Java.7.NIO.2.2011

    《Apress.Pro.Java.7.NIO.2.2011》这本书专注于讲解Java 7中的非阻塞I/O(Non-blocking I/O, NIO)和NIO 2的高级特性,是Java开发者深入理解这一关键领域的重要参考资料。NIO在Java平台中扮演着至关重要的角色,特别...

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    这个文件很可能是一个示例程序,演示了如何使用Java NIO进行高效的大文件复制。在传统的Java I/O中,我们通常使用InputStream和OutputStream进行文件复制,而这种方式需要不断读写,造成大量的上下文切换,效率较低...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,与传统的IO模型(基于流的I/O和基于缓冲区的I/O)相比,NIO具有更高的效率和灵活性。在Java NIO中,数据是以通道...

    Java IO, NIO and NIO.2(Apress,2015)

    Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...

Global site tag (gtag.js) - Google Analytics