`
红桃貳
  • 浏览: 40671 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 学习笔记- File I/O - java.nio.file.Path(Jdk7) 与java.io.File比较

阅读更多

Path 类是jdk7新增加的特性之一,用来代替java.io.File类。

之所以新增这个类,是由于java.io.File类有很多缺陷:

 

1.java.io.File类里面很多方法失败时没有异常处理,或抛出异常,例如:

             

 public boolean delete() {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkDelete(path);
        }
        return fs.delete(this);
    }

 java.io.File.delete()方法返回一个布尔值指示成功或失败但是没有失败原因。而java.nio.file.Files.delete(Path):

 

 

public static void delete(Path path) throws IOException {
        provider(path).delete(path);
    }

 这个方法会抛出:NoSuchFileException,DirectoryNotEmptyException,IOException,SecurityException这样当删除一个文件失败时可以根据异常来查找失败原因。

 

例如:

 

package io.path;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class DeleteFile {

    public static void main(String[] args) throws IOException {
        Path path = Paths.get("H://afile");//This path does not exsit in file system.
        Files.delete(path);
    }
}

 运行结果:

 

Exception in thread "main" java.nio.file.NoSuchFileException: H:\afile
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:268)
at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
at java.nio.file.Files.delete(Files.java:1077)
at io.path.DeleteFile.main(DeleteFile.java:12)

 

2.java.io.File.rename(File file)方法在不同平台中运行时可能会有问题,这个方法不能将一个文件从一个文件系统移到另一个文件系统,这个方法的操作也不是原子性的,如果参数指定的文件名已经存在这个方法也可能执行失败:

 

package io.path;

import java.io.File;
import java.io.IOException;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class FileRename {

    /**
     * Expected Result: rename beforeRename1.txt to rename1.txt; beforeRename1.txt disappears; and the content of
     * rename1.txt is the same with beforeRename1.txt
     */
    public static void rename1() {

        File file = new File("D:\\360云盘\\javase\\src\\io\\beforeRename1.txt");// The content of beforeRename1.txt is a
                                                                              // string
                                                                              // with value "1111"

        File destinationfile1 = new File("D:\\360云盘\\javase\\src\\io\\rename1.txt");// rename1.txt has already
                                                                                    // existed. and the content is null.
        file.renameTo(destinationfile1);
    }

    /**
     * Expected Result: rename beforeRename2.txt to rename2.txt ;beforeRename2.txt disappears; and the content of
     * rename2.txt is the same with beforeRename2.txt,that is "2222"
     */
    public static void rename2() {

        File file = new File("D:\\360云盘\\javase\\src\\io\\beforeRename2.txt");// The content of beforeRename2.txt is a
                                                                              // string
                                                                              // with value "2222"

        File destinationfile2 = new File("D:\\360云盘\\javase\\src\\io\\rename2.txt");// rename2.txt does not exist.
        file.renameTo(destinationfile2);
    }

    
    /**
     * Expected Result: rename beforeRename3.txt to rename3.txt ;beforeRename3.txt disappears; and the content of
     * rename3.txt is the same with beforeRename3.txt ,that is "3333"
     */
    public static void rename3() throws IOException {
        Path path = Paths.get("D:\\360云盘\\javase\\src\\io\\beforeRename3.txt");// The content of beforeRename3.txt is a
                                                                               // string with value of "3333"

        Path pathRename = Paths.get("D:\\360云盘\\javase\\src\\io\\rename3.txt");// rename3.txt has already existed,and
                                                                               // the content is null.

        Files.move(path, pathRename, StandardCopyOption.REPLACE_EXISTING);
    }

    public static void main(String[] args) throws IOException {
//        rename1();
//        rename2();
        rename3();
    }
}

 

上面这个类中,执行之后会发现,beforeRename1.txt依然还在,rename1.txt的文件内容也米有改变,而beforeRename2.txt文件已经被重命名为rename2.txt,而且rename2.txt的内容与beforeRename2.txt的内容一样 为“2222”。但是如果使用java.nio.Files.move(Path source, Path target, CopyOption... options)可以发现即使 rename3已经存在,也可以把beforeRename3.txt成功的重命名为rename3.txt

 

 

3. 读取文件属性相关

File类中读取文件属性都是一个方法返回一个属性值,而没有能够直接一次返回很多属性的方法,造成访问文件属性时效率的问题。

但是对于jkd7新增的api中可以批量读取文件属性,而且可以访问到文件更详细的属性。

package io.path;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Map;

public class FileAttribute {

    public static void main(String[] args) throws IOException {
        // ==============Get attribute by File=========================
        File file = new File("D:\\360云盘\\javase\\src\\io\\path.txt");
        System.out.println("isDirectory:" + file.isDirectory());
        System.out.println("isHidden:" + file.isHidden());
        System.out.println("canRead:" + file.canRead());
        System.out.println("canWrite:" + file.canWrite());
        System.out.println("lastModified:" + file.lastModified());
        System.out.println("length:" + file.length());

        // ==============Get attribute by Path=========================

        Path path = Paths.get("D:\\360云盘\\javase\\src\\io\\path.txt");
        readAttributes(path, "*", LinkOption.NOFOLLOW_LINKS);
        System.out.println(Files.getOwner(path, LinkOption.NOFOLLOW_LINKS).getName());

        BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class,
                LinkOption.NOFOLLOW_LINKS);
        System.out.println(attributes.fileKey());
        System.out.println(attributes.isOther());
    }

    /**
     * 
     * @param path
     * @param attributes
     * @param linkOption
     * @throws IOException
     */
    public static void readAttributes(Path path, String attributes, LinkOption... linkOption) throws IOException {
        Map<String, Object> map = Files.readAttributes(path, attributes, linkOption);
        for (String s : map.keySet()) {
            System.out.println(s + ":" + map.get(s));
        }
    }

}

 

除了以上还有其它一些问题,例如file.list();方法在处理比较大的目录时效率很低,但是为什么效率低?而java.nio.file是怎样优化的呢?没搞清楚.........

 

 

分享到:
评论
1 楼 3GQQ2012 2013-09-14  
io.File只能通过listFile一次性全部获取File,但是这样对大目录处理时很耗内存, java.nio.file通过visitor模式和steam进行迭代 每次只处理一个 来改进性能

相关推荐

    Java学习超强笔记

    - JDK安装与环境变量配置:讲解如何在不同操作系统上安装Java Development Kit,并设置JAVA_HOME、PATH和CLASSPATH等环境变量。 2. **Java基础语法** - 变量和数据类型:介绍基本数据类型(如整型、浮点型、字符...

    java基础18天Typora笔记

    熟悉Java的文件路径处理和NIO(New IO)库,提升文件操作效率。 10. **反射机制** 反射允许在运行时动态获取类的信息并操作类的对象。它可以用于创建对象、调用方法、访问字段,为代码的动态性提供支持。 11. **...

    java-help.rar_Java编程_Java_

    1. **Java环境配置**:包括JDK(Java Development Kit)的下载和安装,设置JAVA_HOME环境变量,以及配置PATH,确保可以在命令行中运行Java编译器(javac)和Java虚拟机(java)。 2. **基本语法**:如声明变量(int...

    java_notebook_recite_version:java内卷笔记背诵版

    Java内卷笔记背诵版是针对Java学习者精心编排的一份资料,旨在帮助学习者深入理解和记忆Java编程的关键知识点。这份笔记包含了Java语言的基础、进阶和实战内容,是提高编程技能和应对面试的理想参考资料。 一、Java...

    《基于YOLOv8的八段锦练习指导系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    大语言模型教育应用中的知识冲突挑战与应对策略

    内容概要:本文详细探讨了大语言模型(LLMs)在教育应用中遇到的知识冲突问题,包括概念定义、事实陈述和逻辑推理层面的认知不一致性。文章分析了知识冲突的技术成因,如训练数据噪声、参数化知识表示的局限、推理机制的缺陷、模型架构的不足及外部知识的偏差,并探讨了这些因素对教育应用的深远影响。文中提出了多维度的解决路径,如通过数据增强优化知识表示、利用提示强化上下文连贯、开发量规完善模型评估等。此外,文章从社会文化的宏观视角剖析了知识冲突的外部驱动因素,探讨如何在多元异质、动态演进的社会建构语境中构建开放进取、兼容融通的智能教育应用体系。 适合人群:从事教育技术研究的学者、教育工作者、人工智能研究人员和技术开发者。 使用场景及目标:①帮助教育工作者理解大语言模型在教育应用中的局限性;②为技术人员提供优化大语言模型教育应用的具体策略;③促进教育人工智能技术的可靠性、适应性和普及性提升。 其他说明:文章强调了知识冲突的有效化解不仅能够提升大语言模型在教育场景中的应用价值,还将为人工智能在更广泛领域的可持续发展奠定坚实基础。

    《基于YOLOv8的家具鉴定系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    数据结构day1-思维导图顺序表

    数据结构day1-思维导图顺序表

    STM32超声波红外避障小车

    STM32超声波红外避障小车项目通过STM32微控制器实现自动避障功能。硬件部分主要包括STM32开发板、超声波传感器、红外传感器、直流电机、电池模块和电机驱动模块。超声波传感器用于测量前方障碍物的距离,红外传感器帮助小车检测地面线路或障碍物。电机驱动模块通过STM32控制直流电机的转动,从而实现小车的前进、后退和转向。 在软件方面,STM32通过编写简单的避障算法,实时读取传感器数据,并根据环境信息控制小车的运动。当超声波传感器检测到障碍物时,系统会触发后退或转向操作,避免碰撞。

    哈尔滨工业大学DeepSeek公开课-从图灵测试到DeepSeek.pdf

    哈尔滨工业大学DeepSeek公开课-从图灵测试到DeepSeek.pdf

    《基于YOLOv8的冰上运动监测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    《基于YOLOv8的体育产业监测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    《基于YOLOv8的港口机械识别系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    oooooomy_vchat_1742859071.zip

    app开发

    《基于YOLOv8的3D打印缺陷检测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    Screenshot_2025-03-31-19-36-01-657_com.UCMobile.jpg

    Screenshot_2025-03-31-19-36-01-657_com.UCMobile.jpg

    半导体过程控制篇 集成电路的可靠性仿真_03_31_153111.docx

    半导体过程控制篇 集成电路的可靠性仿真_03_31_153111.docx

    社交应用_鸿蒙OS_API12_高仿微信APP_开发示例_1742847098.zip

    社交应用_鸿蒙OS_API12_高仿微信APP_开发示例_1742847098.zip

    《基于YOLOv8的民间体育监测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    安卓_热更新_简化编译_HTHotFix框架_1742849446.zip

    app开发

Global site tag (gtag.js) - Google Analytics