I/O流、文件操作

时间:2022-06-10 10:03:25

1)操作文件

Path和Files是在JavaSE7中新添加进来的类,它们封装了在用户机器上处理文件系统所需的所有功能。Path表示的一个目录名序列,其后还可以跟着一个文件名。路径中的第一个参数可以是根路径,以根路径开始的路径是绝对路径,否则就是相对路径。如果其路径不是合法路径则会抛出InvalidPathException异常。

绝对路径:

Path path=Paths.get("G:\\", "temp","temp.txt");

相对路径:

Path path2=Paths.get("temp", "temp.txt");

1.1组合或解析路径是司空见惯的操作,调用p.resolve(q)将按照下列规则返回一个路径:

A.如果q是绝对路径,则结果就是q

B.否则根据文件系统的规则将p后面跟着q作为结果

例子:

        Path p=Paths.get("G:\\", "temp");        
        Path q=Paths.get("temp.txt");        
        Path path=p.resolve(q);
        System.out.println(path);
        //结果:G:\temp\temp.txt
        
        p=Paths.get("G:\\");
        q=Paths.get("H:\\","temp");
        path=p.resolve(q);
        System.out.println(path);
        //结果:H:\temp

2)读写文件

Files类是普通文件操作变得快捷,但是比较适合处理中等长度的文件,如果要处理的文件长度比较大,或者二进制文件,那么还是应该使用熟知的流(Stream)或者读入器(Reader)/写出器(Writer)。

Files的readAllBytes方法读取文件返回字节数,readAllLines返回一个String类型的列表,调用write方法写入字节组或者String类型的列表。

例子:

        //字节数组写入文件内容
        Path q=Paths.get("G:\\","temp.txt");
        Files.write(q, "123123".getBytes("UTF-8"));
        
        //读出字节数组并打印出来
        byte[]b=Files.readAllBytes(q);
        System.out.println(new String (b));
        
        //字符串写入文件内容
        List<String>linesList=new ArrayList<String>();
        linesList.add("11111111111111");
        linesList.add("22222222222222");
        linesList.add("33333333333333");
        Files.write(q, linesList);
        
        //打印读取的数据
        List<String>lineStrings=Files.readAllLines(q);
        for (String itemString : lineStrings) {
            System.out.println(itemString);
        }        

3)复制、移动和删除文件

Files提供很方便复制、移动、删除文件的方法,Files.copy(FromPaht,toPath),Files.move(fromPath,ToPath),Files.deleteIfExists(path),三个方法中可以增加一个StandardCopyOption枚举参数(REPLACE_EXISTING,COPY_ATTRIBUTES,ATOMIC_MOVE)。

        // 复制文件到指定路径
        Path path=Paths.get("G:\\", "temp.txt");
        Path path2=Paths.get("H:\\","temp.txt");
        Files.copy(path, path2, StandardCopyOption.REPLACE_EXISTING);
        
        // 移动文件到指定路径(StandardCopyOption.ATOMIC_MOVE不允许跨磁盘移动文件,去掉其选项可以跨磁盘移动文件)
        Path path3=Paths.get("F:\\", "temp.txt");
        Files.move(path2, path3, StandardCopyOption.ATOMIC_MOVE);
        
        // 删除文件(最好使用deleteIfExists方法删除文件,不建议使用delete方法删除文件,因为若文件不存在报异常)
        boolean isDelete=Files.deleteIfExists(path3);

4)获取文件信息

Files的一些静态方法获取文件的相关属性,例如:exists(文件是否存在),isHidden(是否是隐藏文件),isReadable(是否可以读),isWriteable(是否可写),isExecutable(是否是可执行文件),isRegularFile(是否是普通文件),isDirectory(是否是目录),isSymbolicLink(是否是符号链接)。当然readAttributes方法可以获取更多的属性例如最后访问时间,修改时间等在此不举例说明了。