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());通过继承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; } }); }}
