java7输入输出流中NIO.2

    xiaoxiao2026-06-10  9

    一。Path,Paths,Files及常用API

    Path,Paths,Files这三个类的加入使得对普通文件的处理更加快捷。让程序猿从FileOutputStream,BufferedInputStream等复杂的流操作中解救出来。

    Path p=Paths.get("F:\\emp.txt"); byte[] by=Files.readAllBytes(p); String con=new String(by,"UTF-8");两句话便完成了对一个文件的读入,第三句话是将文件当字符串读入。

    对于文件的移动,也变得简单了不少。复制也同理,将move改为copy。

    值得注意的是:如果目标文件已经存在,则会移动失败,若是要覆盖原有文件,可以使用REPLACE_EXISTING选项。

    Files.move(from, to,StandardCopyOption.REPLACE_EXISTING);

    若是想要复制所有文件属性,可以使用COPY_ATTRIBUTES.

    Path from=Paths.get("F:\\emp.txt"); Path to=Paths.get("G:\\move.txt"); Files.move(from, to);

    删除文件:Files.delete(path);若目标文件不存在抛异常。Files.deleteIfExists(path);若目标不存在会返回false。

    创建新目录:Files.createDirectory(path);

    创建新文件:Files.createFile(path);

    Files类还可以获取文件信息。

    如函数static boolean exists(path);等,详情见官方文档:官方Files介绍

    Files可以高效地获取一个目录中所有文件(相对于File的方法高效地多)

    DirectoryStream<Path>entries = Files.newDirectoryStream(path); for(Path entry:entries) { System.out.println(entry); }并且,若是想要过滤文件也是可以的 比如 Files.new DirectorStream(path,"*.java");

    常见的用法:

    // 复制文件 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<String> 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<String> poem = new ArrayList<>(); poem.add("水晶潭底银鱼跃"); poem.add("清徐风中碧竿横"); // 直接将多个字符串内容写入指定文件中 Files.write(Paths.get("pome.txt") , poem , Charset.forName("gbk")); FileStore cStore = Files.getFileStore(Paths.get("C:")); // 判断C盘的总空间,可用空间 System.out.println("C:共有空间:" + cStore.getTotalSpace()); System.out.println("C:可用空间:" + cStore.getUsableSpace());

    二。使用FileVisitor 遍历文件和目录

    通过继承SimpleFileVisitor,便可以实现访问目录下所有子目录。

    或者调用Files.walkFileTree(Path start,FileVisitor<? super Path>visitor) 实现一个匿名内部类。

    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<Path>() { // 访问文件时候触发该方法 @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; } }); }}

    三。监控文件变化:(这个只可以监控当下目录,不会监控到当前目录子目录)

    WatchService watch =FileSystems.getDefault().newWatchService(); Path p=Paths.get("C:/"); p.register(watch,StandardWatchEventKinds.ENTRY_CREATE); while(true) { WatchKey key = watch.take(); for (WatchEvent event: key.pollEvents()) { System.out.println("context:"+event.context()+" kind:"+event.kind()); } }

    四。查看文件的属性,及自定义文件属性(用到了序列化知识 了解序列化的知识 )

    // 获取将要操作的文件 Path testPath = Paths.get("AttributeViewTest.java"); // 获取访问基本属性的BasicFileAttributeView BasicFileAttributeView basicView = Files.getFileAttributeView( testPath , BasicFileAttributeView.class); // 获取访问基本属性的BasicFileAttributes BasicFileAttributes basicAttribs = basicView.readAttributes(); // 访问文件的基本属性 System.out.println("创建时间:" + new Date(basicAttribs .creationTime().toMillis())); System.out.println("最后访问时间:" + new Date(basicAttribs .lastAccessTime().toMillis())); System.out.println("最后修改时间:" + new Date(basicAttribs .lastModifiedTime().toMillis())); System.out.println("文件大小:" + basicAttribs.size()); // 获取访问文件属主信息的FileOwnerAttributeView FileOwnerAttributeView ownerView = Files.getFileAttributeView( testPath, FileOwnerAttributeView.class); // 获取该文件所属的用户 System.out.println(ownerView.getOwner()); // 获取系统中guest对应的用户 UserPrincipal user = FileSystems.getDefault() .getUserPrincipalLookupService() .lookupPrincipalByName("guest"); // 修改用户 ownerView.setOwner(user); // 获取访问自定义属性的FileOwnerAttributeView UserDefinedFileAttributeView userView = Files.getFileAttributeView( testPath, UserDefinedFileAttributeView.class); List<String> attrNames = userView.list(); // 遍历所有的自定义属性 for (String name : attrNames) { ByteBuffer buf = ByteBuffer.allocate(userView.size(name)); userView.read(name, buf); buf.flip(); String value = Charset.defaultCharset().decode(buf).toString(); System.out.println(name + "--->" + value) ; } // 添加一个自定义属性 userView.write("发行者", Charset.defaultCharset() .encode("疯狂Java联盟")); // 获取访问DOS属性的DosFileAttributeView DosFileAttributeView dosView = Files.getFileAttributeView(testPath , DosFileAttributeView.class); // 将文件设置隐藏、只读 dosView.setHidden(true); dosView.setReadOnly(true);

    转载请注明原文地址: https://ju.6miu.com/read-1310392.html
    最新回复(0)