java中Paths和Files使用

java中Paths和Files使用

一、简介

java中,借助Paths和Files类,可以方便高效地对文件进行操作,这里直接以示例介绍,更多使用方法请查看源码。

二、Paths

Paths可对路径进行组装、拼接、转换等。

2.1 路径定义
//自定义打印公共方法
    private static BiConsumer<String, Object> pt = (t, r) -> System.out.println(String.format("%s:%s", t, r));
    //目录路径
    private static Path dp = Paths.get("/home/xx/file");
    //目录路径
    private static Path dp1 = Paths.get(dp.toString(), "one", "1");
    //文件路径
    private static Path fp = Paths.get(dp.toString(), "t.txt");
    //文件路径
    private static Path fp1 = Paths.get(dp.toString(), "t1.txt");
    //文件路径
    private static Path fp2 = Paths.get(dp.toString(), "t2.txt");
2.2 路径操作
@SneakyThrows
    public static void pathAttr() {
//        Path fp = Paths.get("/home/t/one");
        //获取绝对路径
        pt.accept("file absolution path", fp.toAbsolutePath());
        //获取根路径
        pt.accept("file root path", fp.getRoot());
        //获取父路径
        pt.accept("file parent path", fp.getParent());
        //获取子路径,包含开始,不包含结束
        pt.accept("file sub path", fp.subpath(0,3));
        //获取最终路径,去掉类似.表示当前路径,..表示父路径,
        pt.accept("file normalize path", Paths.get("/home/t/../one").normalize()); //  /home/one
        pt.accept("file normalize path", Paths.get("/home/t/./one").normalize()); //  /home/t/one
        //获取相对路径(相对指定的路径)
        pt.accept("file relativize", Paths.get("/home/t/one/two").relativize(Paths.get("/home/t"))); // ../..
        //获取访问路径uri
        pt.accept("file uri", fp.toUri());
        //获取文件名
        pt.accept("file name", fp.getFileName());
        //获取路径中元素个数
        pt.accept("file name count", fp.getNameCount());
        //获取路径中第0位的名称
        pt.accept("file name , index 0 ", fp.getName(0));
        //获取路径中最后一位的名称
        pt.accept("file name , index last ", fp.getName(fp.getNameCount() - 1));
    }

三、Files

Files可对文件进行创建、修改、读取等操作。

3.1 获取文件属性
@SneakyThrows
    public static void fileAttr() {
        //检测文件大小,单位bytes
        pt.accept("file size", Files.size(fp));
        //检测文件拥有者
        pt.accept("file owner", Files.getOwner(fp));
        //检测文件类型
        pt.accept("file content type", Files.probeContentType(fp));
        //检测文件存储
        pt.accept("file store", Files.getFileStore(fp));
        //检测文件最后修改时间
        pt.accept("file last modify time", Files.getLastModifiedTime(fp));

        //获取文件属性
        PosixFileAttributes attrs = Files.readAttributes(dp1, PosixFileAttributes.class);
        //获取文件所有者
        pt.accept("file owner", attrs.owner().getName());
        pt.accept("file create time", attrs.creationTime());
        pt.accept("file lastModifiedTimee", attrs.lastModifiedTime());
        pt.accept("file lastModifiedTimee", attrs.size());

        //获取文件权限
        Set<PosixFilePermission> perms = attrs.permissions();
        pt.accept("file permission", PosixFilePermissions.toString(perms));
    }
3.2 文件属性操作
@SneakyThrows
    public static void fileAttrOpt() {
        Files.createDirectories(dp1);

        //获取文件属性
        PosixFileAttributes attrs = Files.readAttributes(dp1, PosixFileAttributes.class);
        //获取文件权限
        Set<PosixFilePermission> perms = attrs.permissions();

        //修改文件属性,设置other可写
        perms.add(PosixFilePermission.OTHERS_WRITE);
        Files.setPosixFilePermissions(dp1, perms);
        pt.accept("file permission", PosixFilePermissions.toString(perms));

        //修改文件属性,设置所有权限
        Set<PosixFilePermission> nPerms = PosixFilePermissions.fromString("rwxrwxrwx");
        Files.setPosixFilePermissions(dp1, nPerms);
        pt.accept("file permission", PosixFilePermissions.toString(nPerms));

        //文件创建时指定权限
        FileAttribute<Set<PosixFilePermission>> nAttrs= PosixFilePermissions.asFileAttribute(nPerms);
        Path dp2 = Paths.get(dp.toString(), "one", "2");
        Files.createDirectories(dp2, nAttrs);


        //修改文件属性,清除文件属性(危险,慎用)
//        perms.clear();
//        Files.setPosixFilePermissions(dp1, perms);
//        pt.accept("file permission", PosixFilePermissions.toString(perms));
    }
3.3 文件检测
public static void fileCheck() {
        //检测文件夹是否存在
        pt.accept("directory exist", Files.exists(dp));
        //检测文件是否存在
        pt.accept("file exist", Files.exists(fp));
        //检测是否是文件
        pt.accept("is file", Files.isRegularFile(fp));
        //检测是否是可执行文件
        pt.accept("is execute file", Files.isExecutable(fp));
        //检测是否是可写文件
        pt.accept("is writable file", Files.isWritable(fp));
        //检测是否是可读文件
        pt.accept("is readable file", Files.isReadable(fp));
    }
3.4 文件操作
    @SneakyThrows
    public static void fileOpt() {
        //文件创建
        Files.createFile(fp2);
        //指定文件权限
        Files.setPosixFilePermissions(fp2, PosixFilePermissions.fromString("rwxrwxrwx"));

        //文件复制,返回结果文件路径
        Files.copy(fp, fp1);
        //文件移动,返回结果文件路径
        pt.accept("file move", Files.move(fp1, fp2).toString());
        //文件删除
        Files.delete(fp2);
        //文件删除,删除成功返回true,失败返回false
        pt.accept("file deleteIfExists", Files.deleteIfExists(fp2));
    }
3.5 文件内容操作
    @SneakyThrows
    public static void fileCntOpt() {
//        BufferedWriter bw = Files.newBufferedWriter(fp);
        //文件写入,追加
        Files.write(fp, "w1".getBytes(), StandardOpenOption.APPEND);
        //文件写入,文件不存在时新建、删除已有文件内容、实时同步
        Files.write(fp, "w3".getBytes(), StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING,  StandardOpenOption.SYNC);


        //读取文件所有字节
        byte[] bs = Files.readAllBytes(fp);
        pt.accept("file content", new String(bs));
        //读取文件所有行 方式一
        List<String> lines = Files.readAllLines(fp);
        lines.forEach(t-> System.out.println("file line:"+t));
        //读取文件所有行 方式二
        Files.lines(fp).forEach(t-> System.out.println("file line:"+t));
        Files.lines(fp, Charset.forName("UTF-8")).forEach(t-> System.out.println("file line:"+t));
        //读取文件所有行 方式三
//        InputStream is = Files.newInputStream(fp);
        BufferedReader br = Files.newBufferedReader(fp);
        String line;
        while(!StringUtils.isEmpty(line = br.readLine())){
            System.out.println("file line:"+line);
        }
    }
3.6 文件目录遍历
@SneakyThrows
    public static void dirVisit() {
        //递归遍历目录
        Files.walk(dp).forEach(System.out::println);
        //递归遍历目录,只输出文件
        Files.walk(dp).filter(t->Files.isRegularFile(t)).forEach(System.out::println);
        //递归遍历目录,只输出文件夹
        Files.walk(dp).filter(t -> Files.isDirectory(t)).forEach(System.out::println);

        //只遍历当前目录
        Files.newDirectoryStream(dp).forEach(System.out::println);
        //只遍历当前目录
        Files.list(dp).forEach(System.out::println);

        //递归遍历目录, 参数2设置访问操作
        Files.walkFileTree(dp, new SimpleFileVisitor<Path>(){
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                System.out.println(file.toString());
                return FileVisitResult.CONTINUE;
            }
        });

        //查找目录,查找深度为1
        Files.find(dp, 1, (p, a)-> true).forEach(System.out::println);
        //查找目录,查找深度为1, 并过滤当前目录
        Files.find(dp, 1, (p, a)-> !p.equals(dp)).forEach(System.out::println);
        //查找目录,查找深度为2
        Files.find(dp, 2, (p, a)-> true).forEach(System.out::println);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值