黑马程序员技术交流社区

标题: java 7 新特新,新IO,新Files,你不知道的,你没见过的 [打印本页]

作者: kingowe    时间: 2015-5-21 08:47
标题: java 7 新特新,新IO,新Files,你不知道的,你没见过的
java1.7的java.nio.file包中定义的类使得对文件的操作变得简单,灵活的多,且看下面的例子:








作者: kingowe    时间: 2015-5-21 08:50
这次是使用Java7提供的新的方法遍历文件夹。

FileVisitor代表一个文件访问器,walkFileTree()方法会自动遍历start路径下的
所有文件和子目录,遍历文件和子目录都会触发FileVisitor中相应的方法。这四个方法在下面的代码中出现。

FileVisitor中的四个方法会返回一个FileVisitorResult,它代是一个枚举类,代表访问之后的行为。

FileVisitor定义了如下几种行为:

CONTINUE:代表访问之后的继续行为

SKIP_SIBLINGS:代表继续访问,但不访问该文件或目录的兄弟文件或目录

SKIP_SUBTREE:继续访问,但不访问该目录或文件的子目录

TERMINATE:终止访问

import java.io.IOException;   
import java.nio.ByteBuffer;   
import java.nio.CharBuffer;   
import java.nio.charset.Charset;   
import java.nio.charset.CharsetDecoder;   
import java.nio.charset.CharsetEncoder;   
import java.nio.file.FileVisitResult;   
import java.nio.file.FileVisitor;   
import java.nio.file.Files;   
import java.nio.file.Paths;   
import java.nio.file.attribute.BasicFileAttributes;   
public class Test {   
    public static void main(String[] args) throws Exception   
    {   
           
        Files.walkFileTree(Paths.get("D:","java"), new FileVisitor(){   
   
            @Override   
            public FileVisitResult preVisitDirectory(Object dir,   
                    BasicFileAttributes attrs) throws IOException {   
                //访问文件夹之前调用   
                System.out.println(dir);   
                return FileVisitResult.CONTINUE;   
            }   
   
            @Override   
            public FileVisitResult visitFile(Object file,   
                    BasicFileAttributes attrs) throws IOException {   
                // 访问文件调用   
                System.out.println(file);   
                return FileVisitResult.CONTINUE;   
            }   
   
            @Override   
            public FileVisitResult visitFileFailed(Object file, IOException exc)   
                    throws IOException {   
                // 访问文件失败时调用   
                return FileVisitResult.CONTINUE;   
            }   
   
            @Override   
            public FileVisitResult postVisitDirectory(Object dir,   
                    IOException exc) throws IOException {   
                // 访问文件夹之后调用   
                return FileVisitResult.CONTINUE;   
            }   
               
        });   
    }   
}  

文件的拷贝、删除、移动及目录的创建操作:
import java.io.IOException;   
import java.nio.file.Files;   
import java.nio.file.Path;   
import java.nio.file.Paths;   
import java.nio.file.StandardCopyOption;   
   
public class TestFileAndDirectory {   
    public static void main(String[] args) throws IOException {   
        Path source = Paths.get("files/loremipsum.txt");   
        System.out.println(source.getFileName());   
            
        Path target = Paths.get("files/backup.txt");   
        // 拷贝文件,注意拷贝参数(如果存在,替换目标文件)     
        Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);   
            
       // Path toDel = Paths.get("files/backup.txt");     
       // Files.delete(toDel);     
       // System.out.println("File deleted.");     
            
        Path newDir = Paths.get("files/newdir");   
        Files.createDirectories(newDir);   
         //将loremipsum.txt移到newdir目录中   
       Files.move(source, newDir.resolve(source.getFileName()), StandardCopyOption.REPLACE_EXISTING);   
            
    }   
   
}   
作者: kingowe    时间: 2015-5-21 08:54
Java 7中如何遍历文件和文件夹
  1. import java.io.IOException;   
  2. import java.nio.file.FileVisitResult;   
  3. import java.nio.file.Path;   
  4. import java.nio.file.SimpleFileVisitor;   
  5. import java.nio.file.attribute.BasicFileAttributes;   
  6.    
  7. public class MyFileVisitor extends SimpleFileVisitor< Path> {   
  8. //  FileVisitor中的四个方法会返回一个FileVisitorResult,它代是一个枚举类,代表访问之后的行为。     
  9. //  FileVisitor定义了如下几种行为:     
  10. //  CONTINUE:代表访问之后的继续行为     
  11. //  SKIP_SIBLINGS:代表继续访问,但不访问该文件或目录的兄弟文件或目录     
  12. //  SKIP_SUBTREE:继续访问,但不访问该目录或文件的子目录     
  13. //  TERMINATE:终止访问     
  14.    
  15.     @Override   
  16.     public FileVisitResult postVisitDirectory(Path dir, IOException exec)   
  17.             throws IOException {   
  18.         // 访问文件夹之前调用     
  19.         System.out.println("Just visited " + dir);   
  20.         return FileVisitResult.CONTINUE;   
  21.     }   
  22.    
  23.     @Override   
  24.     public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)   
  25.             throws IOException {   
  26.         // 访问文件夹之后调用     
  27.         System.out.println("About to visit " + dir);   
  28.         return FileVisitResult.CONTINUE;   
  29.     }   
  30.    
  31.     @Override   
  32.     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)   
  33.             throws IOException {   
  34.         // 访问文件后调用     
  35.         if (attrs.isRegularFile())   
  36.             System.out.print("Regular File:");   
  37.         System.out.println(file);   
  38.         return FileVisitResult.CONTINUE;   
  39.     }   
  40.    
  41.     @Override   
  42.     public FileVisitResult visitFileFailed(Path file, IOException exc)   
  43.             throws IOException {   
  44.         // 文件不可访问时调用     
  45.         System.out.println(exc.getMessage());   
  46.         return FileVisitResult.CONTINUE;   
  47.     }   
  48.    
  49. }   
复制代码
测试代码:
  1. import java.io.IOException;   
  2. import java.nio.file.Files;   
  3. import java.nio.file.Path;   
  4. import java.nio.file.Paths;   
  5.    
  6. public class TestFileTree {   
  7.     public static void main(String[] args) throws IOException {   
  8.         Path fileDir = Paths.get("files");   
  9.         MyFileVisitor visitor = new MyFileVisitor();   
  10.             
  11.         Files.walkFileTree(fileDir, visitor);   
  12.     }   
  13.    
  14. }
复制代码

运行:
C:\ex>java TestFileTree
About to visit files
About to visit files\newdir
Regular File:files\newdir\psum.txt
Just visited files\newdir
Regular File:files\backup.txt
Regular File:files\loremipsum.txt
Regular File:files\test.txt
Just visited files



作者: 林思奇    时间: 2015-5-21 09:03
表示还没学到,看不懂
作者: 志行    时间: 2015-5-21 09:10
果断收藏了

作者: hzhzhen    时间: 2015-5-21 09:11
什么情况,不讲详细看不懂呢。
作者: 刘冬    时间: 2015-5-21 09:40
学习了!
作者: kingowe    时间: 2015-5-21 10:03
hzhzhen 发表于 2015-5-21 09:11
什么情况,不讲详细看不懂呢。

其实这些方法在API文档中都有的,自己看看文档就完全会用了,我只是指引一下,有些同学可能不知道这些新特性
作者: 凉仁日记    时间: 2015-5-21 21:17
详细到报表




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2