内容参考了:

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

 

FileSystem java 使用 java.nio.files_bc


BasicFileAttribute还有个BasicFileAttributeView

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

FileSystem java 使用 java.nio.files_System_02


 其中一个还是返回那个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/