Path类和Files类详解

本文详细介绍了Java7中新增的文件IO类,包括Path和Files类的使用方法,展示了如何创建、读取、复制文件及遍历目录等常见操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:https://blog.youkuaiyun.com/qq877728715/article/details/104499687/

文章目录

Java7新增文件IO类

Java7中文件IO发生了很大的变化,专门引入了很多新的类:

java.nio.file.DirectoryStream;
java.nio.file.FileSystem;
java.nio.file.FileSystems;
java.nio.file.Files;
java.nio.file.Path;
java.nio.file.Paths;
java.nio.file.attribute.FileAttribute;
java.nio.file.attribute.PosixFilePermission;
java.nio.file.attribute.PosixFilePermissions;

在java中文件或是目录习惯用java.io.File对象来表示,但是File类有很多缺陷

  • 它的很多方法不能抛出异常

  • 它的delete方法经常莫名其妙的失败等,旧的File类经常是程序失败的根源。

  • 因此在Java7中有了更好的替代:java.nio.file.Pathjava.nio.file.Files

    • Path接口的名字非常恰当,就是表示路径的,API中讲Path对象可以是一个文件,一个目录,或是一个符号链接,也可以是一个根目录。 用法很简单。创建Path并不会创建物理文件或是目录path实例经常引用并不存在的物理对象,要真正创建文件或是目录,需要用到Files类

    • Files类是一个非常强大的类,它提供了处理文件和目录以及读取文件和写入文件的静态方法。 可以用它创建和删除路径。复制文件。检查路径是否存在等。 此外。Files还拥有创建流对象的方法。

一.Paths

Paths类仅由静态方法组成,通过转换路径字符串返回Path或URI

  • 因为就两个方法用来生成Path对象,以供Path和Files使用;而Path也经常由Paths来生成,又或者File类有一个toPath();方法可以使用

1.创建Paths

static Path get(String first, String... more) 
//将路径字符串或连接到路径字符串的字符串序列转换为 Path,可以get("c:/abc");或者get("c:","abc"),注意这里可以有多个参数String... more代表n个参数,这个比较常用
static Path get(URI uri) 
//将给定的URI转换为Path对象

 

    二.Path

    Path就是取代File的,用于来表示文件路径和文件。可以有多种方法来构造一个Path对象来表示一个文件路径,或者一个文件:
    - 该接口的实现是不可变且安全的,可供多个并行线程使用。

    1.创建Path

    Path toPath() 
    //File类对象方法--返回一个java.nio.file.Path对象
    abstract Path getPath(String first, String... more) 
    //FileSystem对象方法--将路径字符串或从路径字符串连接起来的一系列字符串转换为 Path 。  
    
     

      1.1.创建Path的三种方式

      创建Path的三种方式

      Path path=FileSystems.getDefault().getPath("d:/users/日记5.txt");    
      //并没有实际创建路径,而是一个指向d:/users/日记5.txt路径的引用
      

      Path path=Paths.get(“d:/users/日记5.txt”); //Paths类提供了这个快捷方法,直接通过它的静态get方法创建path

      Path path= = new File(“d:/users/日记5.txt”).toPath();

        2.Path常用方法

        Path接口没什么判断方法,其实更多的判断和操作都在Files工具类里面

        boolean isAbsolute() 
        //告诉这条路是否是绝对的
        boolean endsWith(Path other) 
        //测试此路径是否以给定的路径结束
        boolean endsWith(String other) 
        //测试此路径是否以给定字符串结束,如"c:/a/banana/cat"可以以"/banana/cat"结尾,但不能以"t"结尾
        boolean startsWith(Path other) 
        //测试此路径是否以给定的路径开始。  
        boolean startsWith(String other) 
        //测试此路径是否以给定字符串开始,跟上面一样规律
        

        Path getFileName()
        //将此路径表示的文件或目录的名称返回为 Path对象,文件名或文件夹名,不含路径
        Path getName(int index)
        //返回此路径的名称元素作为 Path对象。目录中最靠近root的为0,最远的为(count-1),count由下面的方法获得
        int getNameCount()
        //返回路径中的名称元素的数量。0则只有root
        Path getParent()
        //返回 父路径,如果此路径没有父返回null,如/a/b/c返回/a/b,配合下面的方法消除".“或”…"
        Path normalize()
        //返回一个路径,该路径是冗余名称元素的消除。如消除掉"."、"…"
        Path getRoot()
        //返回此路径的根组分作为 Path对象,或 null如果该路径不具有根组件。如返回"c:/"
        Path relativize(Path other)
        //构造此路径和给定路径之间的相对路径。有点难理解,p1-“Topic.txt”,p2-“Demo.txt”,p3-"/Java/JavaFX/Topic.txt",p4-"/Java/2011";;那么p1和p2的结果是"…/Demo.txt";;p2和p1的结果是"…/Topic.txt";;p3和p4的结果是"…/…/2011";;p4和p3的结果是"…/JavaFX/Topic.txt"
        Path resolve(String other)
        //将给定的路径字符串转换为 Path。如"c:/a/b"和字符串"c.txt"的结果是"c:/a/b/c.txt";更像是拼接
        Path resolveSibling(String other)
        //将给定的路径字符串转换为 Path。如"c:/a/b.txt"和字符串"c.txt"的结果是"c:/a/c.txt";更像是替换
        Path subpath(int beginIndex, int endIndex)
        //返回一个相对的 Path ,它是该路径的名称元素的子序列,如"d:/a/b/c.txt"参数为(1,3)返回一个"b/c.txt"
        Path toAbsolutePath()
        //返回表示此路径的绝对路径的 Path对象。包括盘符和文件名或文件夹名

        Iterator<Path> iterator()
        //返回此路径的名称元素的迭代器。“c:/a/b/c.txt"的迭代器可以next出以下"a”“b”“c.txt”
        File toFile()
        //返回表示此路径的File对象

          三.Files

          Files类只包含对文件,目录或其他类型文件进行操作的静态方法。主要和Path接口的对象进行配合使用

          1.判断方法:

          static boolean exists(Path path, LinkOption... options) 
          //测试文件是否存在。  
          static boolean notExists(Path path, LinkOption... options) 
          //测试此路径所在的文件是否不存在。  
          static boolean isDirectory(Path path, LinkOption... options) 
          //测试文件是否是目录。  
          static boolean isExecutable(Path path) 
          //测试文件是否可执行。  
          static boolean isHidden(Path path) 
          //告知文件是否被 隐藏 。  
          static boolean isReadable(Path path) 
          //测试文件是否可读。  
          static boolean isRegularFile(Path path, LinkOption... options) 
          //测试文件是否是具有不透明内容的常规文件。说实话,我也不太懂常规文件指的是啥
          static boolean isSameFile(Path path, Path path2) 
          //测试两个路径是否找到相同的文件。
          static boolean isSymbolicLink(Path path) 
          //测试文件是否是符号链接。//
          static boolean isWritable(Path path) 
          //测试文件是否可写。  
          
           

            2.删除方法

            static boolean deleteIfExists(Path path) 
            //删除文件(如果存在)。  
            static void delete(Path path) 
            //删除文件。  
            
             
            • 4

            3.复制方法

            static long copy(InputStream in, Path target, CopyOption... options) 
            //将输入流中的所有字节复制到文件。
            //关于CopyOption则是一个被继承的接口主要有枚举类StandardCopyOption和LinkOption
            //   1.StandardCopyOption
            //			REPLACE_EXISTING(也就是替换覆盖)
            //          COPY_ATTRIBUTES(将源文件的文件属性信息复制到目标文件中)
            //			ATOMIC_MOVE(原子性的复制)都是字面意思
            //   2.LinkOption
            //			NOFOLLOW_LINKS
            static long copy(Path source, OutputStream out) 
            //将文件中的所有字节复制到输出流。  
            static Path copy(Path source, Path target, CopyOption... options) 
            //将文件复制到目标文件。  
            
             

              4.移动和重命名方法

              static Path move(Path source, Path target, CopyOption... options) 
              //将文件移动或重命名为目标文件。 
              
               

                5.创建文件和文件夹方法

                static Path createDirectories(Path dir, FileAttribute<?>... attrs) 
                //首先创建所有不存在的父目录来创建目录。
                static Path createDirectory(Path dir, FileAttribute<?>... attrs) 
                //创建一个新的目录。  
                static Path createFile(Path path, FileAttribute<?>... attrs) 
                //创建一个新的和空的文件,如果该文件已存在失败。
                
                 

                  6.文件属性方法

                  static <V extends FileAttributeView> V getFileAttributeView(Path path,<V> type, LinkOption... options) 
                  //返回给定类型的文件属性视图。指定六个视图其中一种,上面一开始有点到。拿到的xxxAttributeView会有一个跟下面一样名字的readAttributes方法来得到一个xxxAttributes真正的获取操作就全是在这个xxxAttributes类的对象里get啦
                  static <A extends BasicFileAttributes> A readAttributes(Path path,<A> type, LinkOption... options) 
                  //读取文件的属性作为批量操作。指定一个xxxAttributes,得到一个实例,通过里面的方法得到时间等基本属性
                  

                  static Object getAttribute(Path path, String attribute, LinkOption... options)
                  //读取文件属性的值。这个 String attributes 参数的语法固定是以 view-name:comma-separated-attributes 的形式;view-name指定视图名如basic,posix,acl等,不写默认为basic;有写默认要加":";可以用"basic:“或”"读取所有,又或者用"basic:size,lastModifiedTime"读取大小和修改时间。具体还有那些属性可以看具体指定的类,比如basic视图就看BasicFileAttributes这个接口都有哪些方法,可以读取哪些文件属性。同理,下面的 String attributes 一样是这个理
                  static Map<String,Object> readAttributes(Path path, String attributes, LinkOption... options)
                  //读取一组文件属性作为批量操作。
                  static Path setAttribute(Path path, String attribute, Object value, LinkOption... options)
                  //设置文件属性的值。

                  /* 下面这些也是获取属性的方法,不过还没研究到是怎么用的 */
                  static FileTime getLastModifiedTime(Path path, LinkOption... options)
                  //返回文件的上次修改时间。
                  static UserPrincipal getOwner(Path path, LinkOption... options)
                  //返回文件的所有者。
                  static Set<PosixFilePermission> getPosixFilePermissions(Path path, LinkOption... options)
                  //返回文件的POSIX文件权限。
                  static Path setLastModifiedTime(Path path, FileTime time)
                  //更新文件上次修改的时间属性。
                  static Path setOwner(Path path, UserPrincipal owner)
                  //更新文件所有者。
                  static Path setPosixFilePermissions(Path path, Set<PosixFilePermission> perms)
                  //设置文件的POSIX权限。
                  static long size(Path path)
                  //返回文件的大小(以字节为单位)。

                    7.读取、编辑文件内容方法

                    static BufferedReader newBufferedReader(Path path) 
                    //打开一个文件进行阅读,返回一个 BufferedReader以高效的方式从文件读取文本。  
                    static BufferedReader newBufferedReader(Path path, Charset cs) 
                    //打开一个文件进行阅读,返回一个 BufferedReader ,可以用来以有效的方式从文件读取文本。  
                    static BufferedWriter newBufferedWriter(Path path, Charset cs, OpenOption... options) 
                    //打开或创建一个写入文件,返回一个 BufferedWriter ,可以用来以有效的方式将文本写入文件。  
                    static BufferedWriter newBufferedWriter(Path path, OpenOption... options) 
                    //打开或创建一个写入文件,返回一个 BufferedWriter以高效的方式写入文件。  
                    static SeekableByteChannel newByteChannel(Path path, OpenOption... options) 
                    //打开或创建文件,返回可访问的字节通道以访问该文件。  
                    static SeekableByteChannel newByteChannel(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs) 
                    //打开或创建文件,返回可访问的字节通道以访问该文件。  
                    static InputStream newInputStream(Path path, OpenOption... options) 
                    //打开一个文件,返回输入流以从文件中读取。  
                    static OutputStream newOutputStream(Path path, OpenOption... options) 
                    //打开或创建文件,返回可用于向文件写入字节的输出流。  
                    static byte[] readAllBytes(Path path) 
                    //读取文件中的所有字节。  
                    static List<String> readAllLines(Path path) 
                    //从文件中读取所有行。  
                    static List<String> readAllLines(Path path, Charset cs) 
                    //从文件中读取所有行。
                    static Path write(Path path, byte[] bytes, OpenOption... options) 
                    //将字节写入文件。  
                    static Path write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options) 
                    //将文本行写入文件。  
                    static Path write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options) 
                    //将文本行写入文件。  
                    
                     

                      以上方法适用于处理中等长度的文本文件,如果要处理的文件长度比较大,或者是二进制文件,那么还是应该使用流

                      8.遍历文件列表方法

                      • newDirectoryStream只是遍历当前Path的子目录列表,或者写一个方法里面递归调用实现遍历到底;
                      • walk则是可以通过maxDepth参数来决定遍历的深度,后面的FileVisitOption参数可有可无;
                      • list类似于newDirectoryStream,区别是walk和newDirectoryStream是递归的,list是非递归的
                      static DirectoryStream<Path> newDirectoryStream(Path dir) 
                      //打开一个目录,返回一个DirectoryStream以遍历目录中的所有条目。最好用 try-with-resources 构造,可以自动关闭资源。返回的 DirectoryStream<Path> 其实可以直接使用 Iterator或者for循环 遍历每一个 dir 下面的文件或目录
                      static DirectoryStream<Path> newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) 
                      //上面方法的重载,通过实现参数二(有一个 boolean accept(Path p) 方法来判断文件是否符合需要)来达到过滤的目的。如accept方法中写"return (Files.size(p) > 8192L);"来匹配大于8k的文件
                      static DirectoryStream<Path> newDirectoryStream(Path dir, String glob) 
                      //上面方法的重载,可以通过参数二作为过滤匹配出对应的文件。如 newDirectoryStream(dir, "*.java") 用于遍历目录里所有java后缀的文件
                      

                      static Stream<Path> walk(Path start, FileVisitOption... options)
                      //深度优先遍历。返回一个 Stream ,它通过 Path根据给定的起始文件的文件树懒惰地填充 Path 。
                      static Stream<Path> walk(Path start, int maxDepth, FileVisitOption... options)
                      //深度优先遍历。返回一个 Stream ,它是通过走根据给定的起始文件的文件树懒惰地填充 Path 。

                      static Stream<Path> list(Path dir)
                      //返回一个懒惰的填充 Stream ,其元素是 Stream中的条目。返回的 Stream 里封装了一个 DirectoryStream 用于遍历。

                        四.Path和Files使用

                        import org.junit.Test;
                        import java.io.*;
                        import java.net.MalformedURLException;
                        import java.net.URI;
                        import java.net.URISyntaxException;
                        import java.nio.charset.StandardCharsets;
                        import java.nio.file.FileSystems;
                        import java.nio.file.Files;
                        import java.nio.file.Path;
                        import java.nio.file.Paths;
                        import java.nio.file.attribute.PosixFilePermission;
                        import java.util.HashSet;
                        import java.util.List;
                        import java.util.Set;
                        import java.util.stream.Stream;
                        

                        public class PathAndFilesTest {
                        /**
                        * 创建Path
                        */

                        @Test
                        public void createPath() throws URISyntaxException, MalformedURLException {
                        //1.Paths
                        Path path = Paths.get(“F:/测试数据.csv”);
                        System.out.println(path.getFileName());
                        Path path1 = Paths.get(new URI(“file:///f:/测试数据.csv”));

                            <span class="token comment">//2.FileSystems</span>
                            Path path2 <span class="token operator">=</span> FileSystems<span class="token punctuation">.</span><span class="token function">getDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getPath</span><span class="token punctuation">(</span><span class="token string">"F:/测试数据.csv"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                        
                            <span class="token comment">//3.File</span>
                            Path path3 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"F:/测试数据.csv"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                        <span class="token punctuation">}</span>
                        
                        
                        <span class="token comment">/**
                         * 创建一个空文件/文件夹
                         */</span>
                        <span class="token annotation punctuation">@Test</span>
                        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
                            <span class="token comment">//文件夹</span>
                            Path path <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/hello"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>Files<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span><span class="token comment">//如果不存在</span>
                                Files<span class="token punctuation">.</span><span class="token function">createDirectory</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
                                <span class="token comment">//创建多个目录</span>
                                <span class="token comment">//Files.createDirectories(path);</span>
                            <span class="token punctuation">}</span>
                        
                            <span class="token comment">//文件</span>
                            Path path1 <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/helloFile.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>Files<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span>path1<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span><span class="token comment">//如果不存在</span>
                                Files<span class="token punctuation">.</span><span class="token function">createFile</span><span class="token punctuation">(</span>path1<span class="token punctuation">)</span><span class="token punctuation">;</span>
                            <span class="token punctuation">}</span>
                        <span class="token punctuation">}</span>
                        
                        <span class="token comment">/**
                         * 文件属性
                         */</span>
                        <span class="token annotation punctuation">@Test</span>
                        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">getFileProperties</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
                            Path path <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/测试数据.csv"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>Files<span class="token punctuation">.</span><span class="token function">getLastModifiedTime</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//最后修改时间:2019-05-22T02:52:45.625094Z</span>
                            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>Files<span class="token punctuation">.</span><span class="token function">getOwner</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//拥有者:DESKTOP-GE36VVD\87772 (User)</span>
                            <span class="token comment">//System.out.println(Files.getPosixFilePermissions(path));//权限,非admin可能会报错</span>
                            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>Files<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//文件大小: 34207517</span>
                        <span class="token punctuation">}</span>
                        
                        <span class="token comment">/**
                         * 读取一个文本文件
                         */</span>
                        <span class="token annotation punctuation">@Test</span>
                        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">readText</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
                            Path path <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/test.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            <span class="token comment">//通过bufferedReader读取</span>
                            BufferedReader bufferedReader <span class="token operator">=</span> Files<span class="token punctuation">.</span><span class="token function">newBufferedReader</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> StandardCharsets<span class="token punctuation">.</span>UTF_8<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">///该文件编码是什么newBufferedReader就必须指定什么字符集,否则报错</span>
                        
                            StringBuilder sb <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StringBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            String tempString <span class="token operator">=</span> null<span class="token punctuation">;</span>
                            <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>tempString <span class="token operator">=</span> bufferedReader<span class="token punctuation">.</span><span class="token function">readLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!=</span> null<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
                                sb <span class="token operator">=</span> sb<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>tempString <span class="token operator">+</span> <span class="token string">"\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            <span class="token punctuation">}</span>
                            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>sb<span class="token punctuation">)</span><span class="token punctuation">;</span>
                        
                        
                            <span class="token comment">//通过Files方法readAllLines</span>
                            List<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">&gt;</span></span> strings <span class="token operator">=</span> Files<span class="token punctuation">.</span><span class="token function">readAllLines</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
                            strings<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>System<span class="token punctuation">.</span>out<span class="token operator">:</span><span class="token operator">:</span>println<span class="token punctuation">)</span><span class="token punctuation">;</span>
                        <span class="token punctuation">}</span>
                        
                        <span class="token comment">/**
                         * 拿到文件输入流
                         *
                         * @throws IOException
                         */</span>
                        <span class="token annotation punctuation">@Test</span>
                        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">getInputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
                            Path path <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/test.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            InputStream inputStream <span class="token operator">=</span> Files<span class="token punctuation">.</span><span class="token function">newInputStream</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
                        
                            <span class="token comment">//转换字符流后在包装成缓冲流</span>
                            BufferedReader bufferedReader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BufferedReader</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">InputStreamReader</span><span class="token punctuation">(</span>inputStream<span class="token punctuation">,</span> <span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                        
                            StringBuilder sb <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StringBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            String tempString <span class="token operator">=</span> null<span class="token punctuation">;</span>
                            <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>tempString <span class="token operator">=</span> bufferedReader<span class="token punctuation">.</span><span class="token function">readLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!=</span> null<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
                                sb <span class="token operator">=</span> sb<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>tempString <span class="token operator">+</span> <span class="token string">"\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            <span class="token punctuation">}</span>
                            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>sb<span class="token punctuation">)</span><span class="token punctuation">;</span>
                        <span class="token punctuation">}</span>
                        
                        <span class="token comment">/**
                         * 文件写操作
                         */</span>
                        <span class="token annotation punctuation">@Test</span>
                        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">writeFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
                            Path path <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/writeFile.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                        
                            <span class="token comment">//获取写入流</span>
                            BufferedWriter bufferedWriter <span class="token operator">=</span> Files<span class="token punctuation">.</span><span class="token function">newBufferedWriter</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
                        
                            <span class="token comment">//执行写入操作</span>
                            String str <span class="token operator">=</span> <span class="token string">"write file test"</span><span class="token punctuation">;</span>
                            bufferedWriter<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token punctuation">;</span>
                        
                            <span class="token comment">//关闭资源</span>
                            bufferedWriter<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            bufferedWriter<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                        <span class="token punctuation">}</span>
                        
                        <span class="token comment">/**
                         * 遍历一个文件夹
                         */</span>
                        <span class="token annotation punctuation">@Test</span>
                        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">traverseDirectory</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
                            Path path <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/test"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            Stream<span class="token generics function"><span class="token punctuation">&lt;</span>Path<span class="token punctuation">&gt;</span></span> list <span class="token operator">=</span> Files<span class="token punctuation">.</span><span class="token function">list</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
                            list<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>p <span class="token operator">-</span><span class="token operator">&gt;</span> <span class="token punctuation">{<!-- --></span>
                                System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>p<span class="token punctuation">.</span><span class="token function">getFileName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                        <span class="token punctuation">}</span>
                        
                        <span class="token comment">/**
                         * 遍历文件树
                         */</span>
                        <span class="token annotation punctuation">@Test</span>
                        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">traverseTree</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
                            Path path <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/test/"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            Stream<span class="token generics function"><span class="token punctuation">&lt;</span>Path<span class="token punctuation">&gt;</span></span> walk <span class="token operator">=</span> Files<span class="token punctuation">.</span><span class="token function">walk</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
                            walk<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>path1 <span class="token operator">-</span><span class="token operator">&gt;</span> <span class="token punctuation">{<!-- --></span>
                        

                        // System.out.println(path1.getRoot());//根目录
                        System.out.println(path1.getFileName());//文件名
                        // System.out.println(path1.getParent());//上级目录
                        // System.out.println(path1.getFileSystem());//文件系统
                        });
                        //还有种方式Files.walkFileTree()
                        }

                        <span class="token comment">/**
                         * 文件复制
                         */</span>
                        <span class="token annotation punctuation">@Test</span>
                        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">copyFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
                            Path src <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/测试数据.csv"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            Path dest <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/test/Copy测试数据.csv"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            Files<span class="token punctuation">.</span><span class="token function">copy</span><span class="token punctuation">(</span>src<span class="token punctuation">,</span> dest<span class="token punctuation">)</span><span class="token punctuation">;</span>
                        <span class="token punctuation">}</span>
                        
                        <span class="token comment">/**
                         * 读取权限见上面示例,设置权限
                         */</span>
                        <span class="token annotation punctuation">@Test</span>
                        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">writePermission</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
                            Path path <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"F:/test/导出测试数据.xlsx"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            Set<span class="token generics function"><span class="token punctuation">&lt;</span>PosixFilePermission<span class="token punctuation">&gt;</span></span> permissionSet <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashSet</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                            permissionSet<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>PosixFilePermission<span class="token punctuation">.</span>GROUP_WRITE<span class="token punctuation">)</span><span class="token punctuation">;</span>
                            permissionSet<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>PosixFilePermission<span class="token punctuation">.</span>OWNER_EXECUTE<span class="token punctuation">)</span><span class="token punctuation">;</span>
                            Files<span class="token punctuation">.</span><span class="token function">setPosixFilePermissions</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> permissionSet<span class="token punctuation">)</span><span class="token punctuation">;</span>
                        <span class="token punctuation">}</span>
                        

                        /**
                        * 判断方法
                        * @throws IOException
                        */

                        @Test
                        public void judge() throws IOException {
                        Path path1 = Paths.get(“f:\test”, “Copy测试数据.csv”);
                        Path path2 = Paths.get(“f:\测试数据.csv”);
                        // boolean exists(Path path, LinkOption … opts) : 判断文件是否存在
                        System.out.println(Files.exists(path2, LinkOption.NOFOLLOW_LINKS));//true

                        // boolean isDirectory(Path path, LinkOption … opts) : 判断是否是目录
                        //不要求此path对应的物理文件存在。
                        System.out.println(Files.isDirectory(path1, LinkOption.NOFOLLOW_LINKS));//false

                        // boolean isRegularFile(Path path, LinkOption … opts) : 判断是否是文件

                        // boolean isHidden(Path path) : 判断是否是隐藏文件
                        //要求此path对应的物理上的文件需要存在。才可判断是否隐藏。否则,抛异常。
                        // System.out.println(Files.isHidden(path1));

                        // boolean isReadable(Path path) : 判断文件是否可读
                        System.out.println(Files.isReadable(path1));//true
                        // boolean isWritable(Path path) : 判断文件是否可写
                        System.out.println(Files.isWritable(path1));//true
                        // boolean notExists(Path path, LinkOption … opts) : 判断文件是否不存在
                        System.out.println(Files.notExists(path1, LinkOption.NOFOLLOW_LINKS));//false
                        }
                        }

                        <span class="token comment">/**
                         * StandardOpenOption.READ:表示对应的Channel是可读的。
                         * StandardOpenOption.WRITE:表示对应的Channel是可写的。
                         * StandardOpenOption.CREATE:如果要写出的文件不存在,则创建。如果存在,忽略
                         * StandardOpenOption.CREATE_NEW:如果要写出的文件不存在,则创建。如果存在,抛异常
                         */</span>
                        <span class="token annotation punctuation">@Test</span>
                        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">ioStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
                        	Path path1 <span class="token operator">=</span> Paths<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"f:\\test"</span><span class="token punctuation">,</span> <span class="token string">"copyTest.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                        

                        // InputStream newInputStream(Path path, OpenOption…how):获取 InputStream 对象
                        InputStream inputStream = Files.newInputStream(path1, StandardOpenOption.READ);

                        // OutputStream newOutputStream(Path path, OpenOption…how) : 获取 OutputStream 对象
                        OutputStream outputStream = Files.newOutputStream(path1, StandardOpenOption.WRITE, StandardOpenOption.CREATE);

                        // SeekableByteChannel newByteChannel(Path path, OpenOption…how) : 获取与指定文件的连接,how 指定打开方式。
                        SeekableByteChannel channel = Files.newByteChannel(path1, StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE);

                        // DirectoryStream<Path> newDirectoryStream(Path path) : 打开 path 指定的目录
                        Path path2 = Paths.get(“f:\test”);
                        DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path2);
                        Iterator<Path> iterator = directoryStream.iterator();
                        while (iterator.hasNext()) {
                        System.out.println(iterator.next());
                        }
                        }

                          五.FileTime对象

                          表示文件时间戳属性的值,可能会在设置文件最后更新属性时使用到:

                          static FileTime fromMillis(long value) 
                          //返回一个 FileTime以 FileTime单位表示给定值。  
                          long toMillis() 
                          //返回以毫秒为单位的值。
                          String toString() 
                          //返回此 FileTime的字符串表示 FileTime 。  
                          
                           

                            栗子:

                            /**
                             * 可能你要从文件属性中的FileTime或者到一个Date对象
                             */
                            Path pathObj = Paths.get("C:/a/b/c.txt");
                            BasicFileAttributes attrs = Files.readAttributes(pathObj, BasicFileAttributes.class);
                            Data date = new Date(attrs.lastModifiedTime().toMillis());
                            

                            /**

                            • 又或者可能你要人为地修改这个文件时间属性,需要一个FileTime
                              */
                              Path path = Paths.get(“C:/a/b/c.txt”);
                              long time = System.currentTimeMillis();
                              FileTime fileTime = FileTime.fromMillis(time);
                              try{
                              Files.setAttribute(path, “basic:lastModifiedTime”, fileTime,LinkOption.NOFOLLOW_LINKS);
                              }catch (IOException e) {
                              System.err.println(e);
                              }
                              评论 1
                              添加红包

                              请填写红包祝福语或标题

                              红包个数最小为10个

                              红包金额最低5元

                              当前余额3.43前往充值 >
                              需支付:10.00
                              成就一亿技术人!
                              领取后你会自动成为博主和红包主的粉丝 规则
                              hope_wisdom
                              发出的红包
                              实付
                              使用余额支付
                              点击重新获取
                              扫码支付
                              钱包余额 0

                              抵扣说明:

                              1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
                              2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

                              余额充值