Java--文件

1.Path

  • Paths.get(String first,String... more):通过连接给定的字符串创建一个路径。
  • resolve(Path other) 和 resolve(String more):如果other是绝对路径,那么就返回other;否则,返回通过连接this和other获得路径。
  • resolveSibling(Path other)和resolveSibling(String other):如果other是绝对路径,那么就返回other;否则,返回通过连接this的父路径和other获得的路径。
  • relativize(Path other):返回用this进行解析,相对于other的相对路径。
  • normalize():移除诸如. 和.. 等冗余的路径元素。
  • toAbsolutePath():返回与该路径等价的绝对路径。
  • getParent():返回父路径,或者在该路径没有父路径时,返回null。
  • getFileName():返回该路径的最后一个部件,或者在该路径没有任何部件时,返回null;
  • getRoot():返回该路径的根部件,或者在该路径没有任何根部件时,返回null。
  • toFile():从改路径中创建一个File对象。
        //路径不必对应某个实际存在的文件,它仅仅只是一个抽象的名字序列。
        Path path = Paths.get("D:","test","12");
        System.out.println(path);
        //path:D:\test\12

        Path path = Paths.get("D:\\test","12");
        System.out.println(path);
        //D:\test\12

        Path path = Paths.get("D:\\test","12");
        Path test = path.resolve("123");
        System.out.println(test);
        //test:D:\test\12\123

        Path resolveOther = path.resolve("D:\\test");
        System.out.println(resolveOther);
        //resolveOther:D:\test

        Path resolveSibling = path.resolveSibling("34");
        System.out.println(resolveSibling);
        //resolveSibling:D:\test\34

        Path resolveSiblingOther = path.resolveSibling("D:\\12");
        System.out.println(resolveSiblingOther);
        //resolveSiblingOther:D:\12

        Path relativize = path.relativize(resolveOther);
        System.out.println(relativize);
        //relativize:   ..

2.读写文件

选项 描述
StandardOption; 与newBufferedWriter,newInputStream,newOutputStream,write一起使用
READ 用于读取而打开
WRITE 用于写入而打开
APPEND 如果用于写入而打开,那么在文件末尾追加
TRUNCATE_EXISTING 如果用于写入而打开,那么移除已有内容
CREATE_NEW 创建新文件并且在文件已存在的情况下会创建失败
CREATE 自动在文件不存在的情况下创建新文件
DELETE_ON_CLOSE 当文件被关闭时,尽“可能”地删除该文件
SPARSE 给文件系统一个提示,标识该文件是稀疏的。
DSYN/SYN 要求对文件数据的每次更新都必须同步地写入到存储设备中
选项 描述
StandardCopyOption; 与copy,move一起使用
ATOMIC_MOVE 原子性的移动文件
COPY_ATTRIBUTES 复制文件的属性
REPLACE_EXISTING 如果目标已存在,则替换它
选项 描述
LinkOption; 与上面所有方法以及exists,isDirectory,isRegularFile等一起使用
NOFOLLOW_LINKS 不要跟踪符号链接
选项 描述
FileVisitOption; 与find,walk,walkFileTree一起使用
FOLLOW_LINKS 跟踪符号链接

Files类中提供了一些方法使得普通文件操作变得快捷。

  • static byte[] readAllBytes(Path):读取文件的所有内容。
    byte[] byte = Files.readAllBytes(Paths.get("C:\\test"));
    String content = new String(bytes, StandardCharsets.UTF_8 );

  • static List<String> readAllLines(Path,charset):将文件当作行序列读入。
    List<String> lines = Files.readAllLines(path,StandardCharsets.UTF_8);

  • static Path write(Path path, byte[] bytes, OpenOption... options);

  • static Path write(Path path,Iterable<? extends CharSequence> lines,OpenOption... options)

  • Files.write(Path path, Iterable<? extends CharSequence> lines,Charset cs, OpenOption... options):将内容写入到文件中,并返回path;

        //将一个字符串写入到文件
        Files.write(path,content.getBytes(StandardCharsets.UTF_8));
        //向指定文件追加内容
        Files.write(path,content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND);
        //将一个行的集合写入到文件中        
        Files.write(path,lines,StandardCharsets.UTF_8,StandardOpenOption.APPEND);

以上的简便方法适用于处理中等长度的文本文件,如果要处理文件长度比较大,或者是二进制文件,那么还是应该使用输入\输出流或者读入器\或写出器。

  • static InputStream newInputStream(Path path, OpenOption... options):获取输入流
  • static OutputStream newOutputStream(Path path, OpenOption... options):获取输出流
  • static BufferedReader newBufferedReader(Path path, Charset cs):获取读入器
  • static BufferedReader newBufferedReader(Path path,Charset cs):获取写入器
        InputStream in = Files.newInputStream(path,StandardOpenOption.READ);
        OutputStream out = Files.newOutputStream(path,StandardOpenOption.WRITE);
        Reader reader = Files.newBufferedReader(path);
        Writer  writer = Files.newBufferedWriter(path);

3.创建文件和目录

  • static Path createFile(Path path, FileAttribute<?>... attrs):创建文件;如果文件已经存在,就会抛出异常。检查文件是否存在和创建文件是原子性的。
  • static Path createDirectory(Path dir, FileAttribute<?>... attrs):创建目录;其中除了最后一个部件外,其他部分都必须是已存在的。
  • static Path createDirectories(Path dir, FileAttribute<?>... attrs):创建目录,并且创建路径中的所有中间目录。
  • tatic Path createTempFile(String prefix,String suffix,FileAttribute<?>... attrs)
  • static Path createTempFile(Path dir,String prefix,String suffix,FileAttribute<?>... attrs):创建临时文件,如果未指定目录,默认是C:\Users\user\AppData\Local\Temp\
  • static Path createTempDirectory(Path dir,String prefix,FileAttribute<?>... attrs)
  • static Path createTempDirectory(String prefix,FileAttribute<?>... attrs):创建一个临时目录。若未指定path,默认的地址为C:\Users\user\AppData\Local\Temp\
Path dir = Files.createTempDirectory(path,"123");
System.out.println(dir);
//D:\test\123921793164291337226  临时目录会添加一个随机数

Path file = Files.createTempFile("","123");
System.out.println(file);
//C:\Users\liming\AppData\Local\Temp\4471255596661424121123   
//临时文件默认的存放路径为C:\Users\liming\AppData\Local\Temp

4.复制、移动和删除文件

  • static void delete(Path path):删除给定文件或空目录。如果文件不存在会出现异常
  • static boolean deleteIfExists(Path path):如果文件或空目录存在则删除
  • static Path move(Path source, Path target, CopyOption... options):移动文件
  • static Path copy(Path source, Path target, CopyOption... options):复制文件
  • static long copy(Path source, OutputStream out):将文件复制到输出流,返回复制的字节数。
  • static long copy(InputStream in, Path target, CopyOption... options):从输入流中复制到文件,返回复制的字节数。

5.获取文件信息

  • static boolean exists(Path path, LinkOption... options):检查path对应的文件或目录是否存在
  • static boolean notExists(Path path, LinkOption... options):检查path定位的文件或目录是否不存在
  • static boolean isReadable(Path path):path对应的文件或目录是否可读
  • static boolean isWritable(Path path):path对应的文件或目录是否可写
  • static boolean isExecutable(Path path):path对应的文件或目录是否可执行
  • static boolean isHidden(Path path):path对应的文件或目录是否隐藏
  • static boolean isDirectory(Path path, LinkOption... options):path对应的文件或目录是否是目录
  • static boolean isSameFile(Path path, Path path2):path与path2对应的文件或目录是否相同
  • static boolean isRegularFile(Path path, LinkOption... options):
  • static boolean isSymbolicLink(Path path) :
  • static long size(Path path):
  • static <A extends BasicFileAttributes> A readAttributes(Path path,Class<A> type,
    LinkOption... options):读取类型为A的文件属性。
        BasicFileAttributes attr = Files.readAttributes(path,BasicFileAttributes.class);
        FileTime creationTime = attr.creationTime();
        System.out.println("creationTime ="+creationTime);
        //creationTime =2021-07-14T00:24:33.964697Z
        FileTime lastAccessTime = attr.lastAccessTime();
        System.out.println("lastAccessTime="+lastAccessTime);
        //lastAccessTime=2021-07-15T02:57:44.823029Z
        FileTime lastModifiedTime =attr.lastModifiedTime();
        System.out.println("lastModifiedTime="+lastModifiedTime);
        //lastModifiedTime=2021-07-15T01:56:11.429886Z
        boolean isRegularFile = attr.isRegularFile();
        System.out.println("isRegularFile="+isRegularFile);
        //isRegularFile=false
        boolean isDirectory = attr.isDirectory();
        System.out.println("isDirectory="+isDirectory);
        //isDirectory=true
        boolean isSymbolicLink = attr.isSymbolicLink();
        System.out.println("isSymbolicLink="+isSymbolicLink);
        //isSymbolicLink=false
        long size = attr.size();
        System.out.println("size="+size);
        //size=0
        Object fileKey = attr.fileKey();
        System.out.println("fileKey="+fileKey);
        //fileKey=null

BasicFileAttributes

  • FileTime creationTime();创建时间
  • FileTime lastAccessTime();最后访问时间
  • FileTime lastModifiedTime();最后修改时间
  • boolean isRegularFile();
  • boolean isDirectory();是否为目录
  • boolean isSymbolicLink();
  • long size();文件大小

6.访问目录中的项

  • static Stream<Path> list(Path dir):返回一个可以读取目录中各个项的Stream<Path>对象。该方法不会进入子目录
  • static Stream<Path> walk(Path start, FileVisitOption... options)
  • static Stream<Path> walk(Path start,int maxDepth,FileVisitOption... options):该方法会会访问目录中的子目录,访问深度为maxDepth;若未指定,则为Integer.MAX_VALUE。
    两种方法都有FileVisitOption选项,但只能提供一种选项:FOLLOW_LINKS,即跟踪符号链接。
  • static Stream<Path> find(Path start,int maxDepth,BiPredicate<Path, > matcher,
    FileVisitOption... options):该方法获取目录中的各个项,并访问子目录。并且通过matcher对所有项进行过滤。
  • static DirectoryStream<Path> newDirectoryStream(Path dir):获取目录流。DirectoryStream不是Stream的子接口,而是专门用于目录遍历的接口,是Iterable的子接口。
try(DirectoryStream<Path> entries = Files.newDirectoryStream(path)){
            for (Path path1 : entries){
                Process entries;
            }
        }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容