[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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值