Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 310|回复: 0

[JavaIO学习]Java7中的目录和文件管理操作实例

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-31 23:58:06 | 显示全部楼层 |阅读模式
    (一)首先我们来看看Path类:
    1. import java.io.IOException;  
    2. import java.nio.file.LinkOption;  
    3. import java.nio.file.Path;  
    4. import java.nio.file.Paths;  
    5.   
    6. public class TestPath {  
    7.     public static void main(String[] args) throws IOException {  
    8.         Path path = Paths.get("files/test.txt");  
    9.          
    10.         // 赋值的文件名,带路径   
    11.         System.out.println(path);  
    12.         // 得到文件名,不带路径   
    13.         System.out.println(path.getFileName());  
    14.         // 得到目录及文件名数目   
    15.         System.out.println(path.getNameCount());  
    16.         // 得到不带路径的文件名   
    17.         System.out.println(path.getName(path.getNameCount() - 1));  
    18.         // 得到真实路径   
    19.         Path realPath = path.toRealPath(LinkOption.NOFOLLOW_LINKS);  
    20.         System.out.println(realPath);  
    21.     }  
    22. }  
    复制代码
    C:ex>java TestPath
    files        est.txt
    test.txt
    2
    test.txt
    C:exfiles        est.txt

    Path类还有:
       getFileSystem() ,可以获取文件系统信息;
       register(WatchService watcher, WatchEvent.Kind<?>... events) ,可以得到对文件或目录的监听; 等操作;
    (二)文件的拷贝、删除、移动及目录的创建操作
    其余操作基本也都差不多,可以去查看帮助文件。
    1. import java.io.IOException;  
    2. import java.nio.file.Files;  
    3. import java.nio.file.Path;  
    4. import java.nio.file.Paths;  
    5. import java.nio.file.StandardCopyOption;  
    6.   
    7. public class TestFileAndDirectory {  
    8.     public static void main(String[] args) throws IOException {  
    9.         Path source = Paths.get("files/loremipsum.txt");  
    10.         System.out.println(source.getFileName());  
    11.          
    12.         Path target = Paths.get("files/backup.txt");  
    13.         // 拷贝文件,注意拷贝参数(如果存在,替换目标文件)   
    14.         Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);  
    15.          
    16.        // Path toDel = Paths.get("files/backup.txt");   
    17.        // Files.delete(toDel);   
    18.        // System.out.println("File deleted.");   
    19.          
    20.         Path newDir = Paths.get("files/newdir");  
    21.         Files.createDirectories(newDir);  
    22.          //将loremipsum.txt移到newdir目录中
    23.        Files.move(source, newDir.resolve(source.getFileName()), StandardCopyOption.REPLACE_EXISTING);  
    24.          
    25.     }  
    26.   
    27. }  
    复制代码
    (三)关于文本文件的读写操作可以参见下面的例子:
    1. import java.io.BufferedReader;  
    2. import java.io.BufferedWriter;  
    3. import java.nio.charset.Charset;  
    4. import java.nio.file.Files;  
    5. import java.nio.file.Path;  
    6. import java.nio.file.Paths;  
    7. import java.util.ArrayList;  
    8.   
    9. public class TestReadingAndWritingTextFile {  
    10.     public static void main(String[] args) {  
    11.         Path source = Paths.get("files/loremipsum.txt");  
    12.         Path target = Paths.get("files/backup.txt");  
    13.          
    14.         ArrayList< String> lines = new ArrayList<>();  
    15.         // 设置文件的编码格式   
    16.         Charset charset = Charset.forName("US-ASCII");  
    17.          
    18.         // 读文件   
    19.         try (BufferedReader reader = Files.newBufferedReader(source, charset);){  
    20.             String line = null;  
    21.             while((line = reader.readLine()) != null) {  
    22.                 lines.add(line);  
    23.             }  
    24.         } catch (Exception e) {  
    25.             e.printStackTrace();  
    26.         }  
    27.          
    28.         // 写文件   
    29.         try (BufferedWriter writer = Files.newBufferedWriter(target, charset)){  
    30.             for (String line : lines) {  
    31.                 writer.append(line+"
    32. ");  
    33.                 writer.flush();  
    34.             }  
    35.         } catch (Exception e) {  
    36.             e.printStackTrace();  
    37.         }  
    38.          
    39.     }  
    40.   
    41. }  
    复制代码
    (四)Java 7中如何遍历文件和文件夹
       主要使用到了Files.walkFileTree()方法,传入的是一个SimpleFileVisitor<Path>参数: Visitor类的实现代码:
    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
    ewdir
    Regular File:files
    ewdirpsum.txt
    Just visited files
    ewdir
    Regular File:filesackup.txt
    Regular File:filesloremipsum.txt
    Regular File:files        est.txt
    Just visited files (五)实现一个查找文件的程序。
       首先我们需要实现一个用来查找的类,我们使用visitor来实现:
    1. import java.io.IOException;  
    2. import java.nio.file.FileSystems;  
    3. import java.nio.file.FileVisitResult;  
    4. import java.nio.file.Path;  
    5. import java.nio.file.PathMatcher;  
    6. import java.nio.file.SimpleFileVisitor;  
    7. import java.nio.file.attribute.BasicFileAttributes;  
    8. import java.util.ArrayList;  
    9.   
    10. public class FindFileVisitor extends SimpleFileVisitor< Path> {  
    11.     private PathMatcher matcher = null;  
    12.     private ArrayList< Path> list = new ArrayList<>();  
    13.       
    14.     public FindFileVisitor(String pattern) {  
    15.         super();  
    16.         // 这里需要匹配文件名,所以我们使用glob:   
    17.         matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);  
    18.         // 如果需要使用正则表达式可以使用下面的   
    19. //      matcher = FileSystems.getDefault().getPathMatcher("regex:" + pattern);   
    20.     }  
    21.     @Override  
    22.     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)  
    23.             throws IOException {  
    24.         Path name = file.getFileName();  
    25.         System.out.println("Examing: " + name);  
    26.         if (matcher.matches(name)) {  
    27.             list.add(file);  
    28.         }  
    29.         return FileVisitResult.CONTINUE;  
    30.     }  
    31.     public ArrayList< Path> getList() {  
    32.         return list;  
    33.     }  
    34.   
    35. }  
    复制代码
    之后我们的测试程序是这样的:
    1. import java.io.IOException;  
    2. import java.nio.file.Files;  
    3. import java.nio.file.LinkOption;  
    4. import java.nio.file.Path;  
    5. import java.nio.file.Paths;  
    6.   
    7.   
    8. public class TestFindFile {  
    9.     public static void main(String[] args) throws IOException {  
    10.         Path path = Paths.get("files");  
    11.         FindFileVisitor visitor = new FindFileVisitor("test*.txt");  
    12.         Files.walkFileTree(path, visitor);  
    13.          
    14.         for (Path file : visitor.getList()) {  
    15.             // 输出绝对路径   
    16.             System.out.println(file.toRealPath(LinkOption.NOFOLLOW_LINKS));  
    17.         }  
    18.     }  
    19.   
    20. }  
    复制代码
    C:ex>java TestFindFile
    Examing: psum.txt
    Examing: backup.txt
    Examing: loremipsum.txt
    Examing: test.txt
    C:exfiles        est.txt

    (六) 如何实现对目录下文件内容修改的监听

    我们先看代码:
    1. import java.nio.file.FileSystems;  
    2. import java.nio.file.Path;  
    3. import java.nio.file.Paths;  
    4. import java.nio.file.StandardWatchEventKinds;  
    5. import java.nio.file.WatchEvent;  
    6. import java.nio.file.WatchKey;  
    7. import java.nio.file.WatchService;  
    8.   
    9. public class TestFileListener {  
    10.     public static void main(String[] args) {  
    11.         // 创建一个监听服务   
    12.         try (WatchService service = FileSystems.getDefault().newWatchService()){  
    13.             // 设置路径   
    14.             Path path = Paths.get("files");  
    15.             // 注册监听器   
    16.             path.register(service, StandardWatchEventKinds.ENTRY_CREATE,   
    17.                     StandardWatchEventKinds.ENTRY_DELETE,  
    18.                     StandardWatchEventKinds.ENTRY_MODIFY);  
    19.               
    20.             WatchKey watchKey;  
    21.             do {  
    22.                 // 得到一个watch key   
    23.                 watchKey = service.take();  
    24.                 for (WatchEvent< ?> event: watchKey.pollEvents()) {  
    25.                     // 如果事件列表不为空,打印事件内容   
    26.                     WatchEvent.Kind< ?> kind = event.kind();  
    27.                     Path eventPath = (Path)event.context();  
    28.                     System.out.println(eventPath + ": " + kind + " : " + eventPath);  
    29.                 }  
    30.             } while (watchKey.reset());  
    31.         } catch (Exception e) {  
    32.             e.printStackTrace();  
    33.         }  
    34.     }  
    35. }  
    复制代码
    接下来我们理清一下思路。对于目录下的文件操作需要做如下工作:
    1、通过FileSystems.getDefault().newWatchService()创建一个监听服务;
    2、设置路径;
    3、对目录注册一个监听器;
    4、之后进入循环,等待watch key;
    5、此时如果有事件发生可通过watchkey的pollevent()方法获取;
    6、之后可以对event处理;
      

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/10/31/235806468.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 21:30 , Processed in 0.355753 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表