Java NIO.2

Java NIO.2的主要表现为增加了Files、Path、Paths等功能类和基于异步Channel的IO。

1、Path、Paths

  如下为使用Path和工具类Paths的示例:

import java.io.*;
import java.net.*;
import java.nio.file.*;

public class Test
{
	public static void main(String[] args)
		throws Exception
	{
		// 以当前路径来创建Path对象
		Path path = Paths.get(".");
		
		// 获取path对应的绝对路径。
		Path absolutePath = path.toAbsolutePath();
		System.out.println(absolutePath); // “D:\java_project\Test\sources\.”
		
		// 获取绝对路径的根路径
		System.out.println("absolutePath的根路径:" + absolutePath.getRoot()); // “D:\”
		
		// 获取绝对路径所包含的路径数量
		int iCnt = absolutePath.getNameCount();
		System.out.println("absolutePath里包含的路径数量:" + iCnt); // 4
		for(int i = 0; i < iCnt; ++i)
			System.out.println(absolutePath.getName(i));// “java_project”、“Test”、“sources”、“.”
		
		// 以多个String来构建Path对象
		Path path2 = Paths.get("g:" , "publish" , "codes");
		System.out.println(path2); //“g:\publish\codes”
	}
}

  使用Path的register()可以监听该Path代表的目录下文件的变化。

2、Files

  Files是File对应的工具类,通过它不仅可以直接获得文件大小、复制文件等,它还可以直接来读取文件、写入文件, 以下为使用工具类Files的示例:

import java.nio.file.*;
import java.nio.charset.*;
import java.io.*;
import java.util.*;

public class FilesTest
{
	public static void main(String[] args)
		throws Exception
	{
		// 复制文件
		Files.copy(Paths.get("FilesTest.java"), new FileOutputStream("a.txt"));
		
		// 判断FilesTest.java文件是否为隐藏文件
		System.out.println("FilesTest.java是否为隐藏文件:" + Files.isHidden(Paths.get("FilesTest.java")));
		
		// 一次性读取FilesTest.java文件的所有行
		List lines = Files.readAllLines(Paths.get("FilesTest.java"), Charset.forName("gbk"));
		System.out.println(lines);
		
		// 获得指定文件的大小
		System.out.println("FilesTest.java的大小为:"
			+ Files.size(Paths.get("FilesTest.java")));
		
		// 直接将多个字符串内容写入指定文件中
		List poem = new ArrayList<>();
		poem.add("水晶潭底银鱼跃");
		poem.add("清徐风中碧竿横");
		Files.write(Paths.get("pome.txt") , poem, Charset.forName("gbk"));
			
		// 使用Java 8新增的Stream列出当前目录下所有文件和子目录
		Files.list(Paths.get(".")).forEach(path -> System.out.println(path));
		// 使用Java 8新增的Stream读取文件中每行内容
		Files.lines(Paths.get("FilesTest.java") , Charset.forName("gbk")).forEach(line -> System.out.println(line));
		
		// 获得C盘的总空间,可用空间
		FileStore cStore = Files.getFileStore(Paths.get("C:"));
		System.out.println("C:共有空间:" + cStore.getTotalSpace());
		System.out.println("C:可用空间:" + cStore.getUsableSpace());
	}
}

  使用Files的walkFileTree()方法遍历文件和目录会更加方便,它还可以指定遍历的深度,其参数类型FileVisitor代表一个文件访问器,当遍历的时候会触发其中相应的方法:

   preVisitDirectory()为访问子目录之前触发。
   postVisitDirectory()为访问子目录之后触发。
   visitFile()为访问文件时触发。
   visitFileFailed为访问文件失败时触发。

  上面这些方法都返回一个FileVisitResult对象,它是一个枚举类对象,用来定义后续行为:

   CONTINUE:继续访问。
   SKIP_SIBLINGS:不访问兄弟文件或目录。
   SKIP_SUBTREE:不访问子目录树。
   TERMINATE:终止访问。

  如下为使用Files的walkFileTree()方法遍历指定目录的示例:


import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;

public class FileVisitorTest
{
	public static void main(String[] args)
		throws Exception
	{
		// 遍历g:\publish\codes\15目录下的所有文件和子目录
		Files.walkFileTree(Paths.get("g:", "publish" , "codes" , "15")
			, new SimpleFileVisitor()
		{
			// 访问文件时候触发该方法
			@Override
			public FileVisitResult visitFile(Path file
				, BasicFileAttributes attrs) throws IOException
			{
				System.out.println("正在访问" + file + "文件");
				// 找到了FileInputStreamTest.java文件
				if (file.endsWith("FileInputStreamTest.java"))
				{
					System.out.println("--已经找到目标文件--");
					return FileVisitResult.TERMINATE;
				}
				return FileVisitResult.CONTINUE;
			}
			// 开始访问目录时触发该方法
			@Override
			public FileVisitResult preVisitDirectory(Path dir
				, BasicFileAttributes attrs) throws IOException
			{
				System.out.println("正在访问:" + dir + " 路径");
				return FileVisitResult.CONTINUE;
			}
		});
	}
}

  java.nio.file.attribute包下提供了XxxAttributeView工具类可以查看或设置文件的修改时间、访问时间、是否只读、是否为系统文件、所有者权限、组所有者等。

你可能感兴趣的:(Java,SE)