java流与文件——操作文件

【0】README

0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——操作文件 的相关知识;
0.2) for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter1/FileAndPathTest.java)


【1】Path

1.1)Path: 表示的是一个目录名序列, 其后还可以跟一个文件名;路径中的第一个部件可以是跟部件, 例如 / 或 C:/ , 而有序访问的根部件,取决于文件系统;(干货——Path类定义)

  • 1.1.1)以根目录开始的是绝对路径,否则就是相对路径;如,
    Path absolute = Paths.get(“/home”, “cay”);
    Path relative = Paths.get(“myprog”, “cay”);
  • 1.1.2) 静态的 Paths.get 方法: 接受一个或多个字符串, 并将它们用默认文件系统的路径分隔符连接起来;
  • 1.1.3)get方法: 可以获取包含多个部件构成的单个字符串, 如, 可以像下面这样从配置文件中读取路径:
    String baseDir = props.getProperty(“base.dir”);
    Path basePath = Paths.get(baseDir);

这里写图片描述

Attention)

  • A1)路径不必对应着某个实际存在的文件, 他仅仅只是一个抽象的名字序列;
  • A2)当你想要创建文件时, 首先要创建一个路径,然后才调用方法去创建对应的文件;

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

  • 1.2.1)如果 q 是绝对路径, 则结果就是q;
  • 1.2.2)否则,根据文件系统的规则, 将p 后面跟着q 作为结果;
  • 1.2.3) resolve 方法有一种快捷方式,它接收一个字符串而不是路径:
    Path workPath = basePath.resolve(“work”);

  • 1.2.4)还有一个 方法: resolveSibling
    它通过解析指定路径的父路径产生其兄弟路径, 例如, 如果workPath 是 /opt/myapp/work, 那么下面的调用
    Path tempPath = workPath.resolveSibling(“temp”) 将创建 /opt/myapp/temp; (干货——创建兄弟路径)

  • 1.2.5)resolve的对立面是 relative: 即调用 p.relativeze(r) 将产生路径q, 对q进行解锁产生r;
  • 1.2.6)normalize 方法:移除所有冗余的 . 和 .. 部件(或者文件系统认为冗余的所有部件);
    如规范化 /home/cay/../fred/./ myprog 将产生 /home/fred/myprog

这里写图片描述

  • 1.2.7)toAbsolutePath 方法: 将产生给定路径的绝对路径, 该绝对路径从根部件开始;
  • 1.2.8) Path类有许多方法用来将路径断开以及和其它路径进行组合。如:
    Path p = Paths.get(“/home”, “myprog.properties”);
    Path parent = p.getParent();
    Path file = p.getFilename();
    Path root = p.getRoot();

  • Attention) 你可能需要与遗留系统的API 交互, 它们使用的是 File 类而不是 Path 类。 Path类有一个toFile 方法, 而 File 类也有一个 toPath 方法;

【2】读写文件

2.1)Files 类可以使得普通文件操作变得快捷;

  • 2.1.1)用下面的方式很容易的读取文件的所有内容:
    byte[] bytes = Files.readAllBytes(path);
  • 2.1.2)如果想将文件当做字符串输入, 则:
    String content = enw String(bytes, charset);
  • 2.1.3)如果希望 将文件当做行序列输入, 则:
    List lines = Files.readAllLines(path, charset);
  • 2.1.4)相反地, 如果希望写出一个字符串到文件中, 则:
    Files.write(path, content.getBytes(charset));

这里写图片描述

  • 2.1.5)向指定文件追加内容,则:
    Files.write(path, content.getBytes(charset), StandardOpoenOption.APPEND);
  • 2.1.6)还可以用下面的语句将一行集合写出到文件中:
    Files.write(path, lines);

这里写图片描述

  • 2.1.7) 如果要处理的文件长度过大, 或者是二进制文件, 那么还是应该使用所熟悉的流或者读入器/ 写出器;
    InputStream is = Files.newInputStream(path);
    OutputStream os = Files.newOutputStream(path);
    Reader reader = Files.newBufferedReader(path, charset);
    Writer writer = Files.newBufferedWriter(path, charset);

  • 2.1.8)总结: 这些便捷方法可以将你从处理 FileInputStream, FileInputStream, BufferedReader 和 BufferedWriter 的繁复操作中解脱出来;


【3】复制、移动和删除文件

3.1)复制文件: Files.copy(fromPath, toPath);
3.2)移动文件 (复制并删除源文件): Files.move(frompath, topath);

  • 3.2.1)如果目标路径已经存在,那么复制或移动将失败;
  • 3.2.2)如果想要覆盖已有的目标路径, 可以使用 REPLACE_EXISTING 选项;
  • 3.2.3)如果想要复制文件的属性, 可以使用 COPY_ATTRIBUTES ;
  • 3.2.4)也可以同时使用者两个选项:
    Files.copy(fromPath, toPath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);
  • 3.2.5)可以将移动操作定义为 原子性的(要么全部成功, 要么就不成功)
    Files.move(fromPath, toPath, StandardCopyOption.ATOMIC_MOVE);
  • 3.2.6)最后删除文件,调用:
    Files.delete(path);
  • 3.2.7)如果要删除的文件不存在, delete 方法就会抛出异常;使用 deleteIfExists 不会抛出异常,
    boolean deleted = Files.deleteIfExists(path); 该方法 deleteIfExists 还可以用来移除空目录;

这里写图片描述


【4】 创建文件和目录

4.1)创建目录: Files.createDirectory(path);
4.2)创建中间目录: Files.createDirectories(path); (迭代创建目录)

  • 4.2.1)创建空文件: Files.createFile(path)
  • 4.2.2)有些便捷方法用来在给定位置或系统指定位置创建临时文件或 临时目录:
    Path newPath = FIles.createTempFile(dir, prefix, suffix);
    Path newPath = FIles.createTempFile( prefix, suffix);
    Path newPath = FIles.createTempFile(dir, prefix);
    Path newPath = FIles.createTempFile(prefix);
  • 其中,dir 是一个Paht对象,prefix 和 suffix 是可以为 null 的字符串;例如,调用 Files.createTempFile(null, “.txt”) 可能返回一个像 /tmp/2345646464646464.txt这样的路径;

这里写图片描述


【5】 获取文件信息

5.1)下面的静态方法都将返回一个boolean值, 表示检查路径的某个属性的结果:
exists + isHidden + isReadable + isWritable + isExecutable + isRegularFile + isDirectory + isSymbolicLink
5.2)size 方法将返回文件的字节数:
long size = Files.size(path);
5.3)getOwner: 将文件的所有者作为 java.nio.file.attribute.UserPrincipal 的一个实例返回;
5.4)所有的文件系统都会报告一个基本属性集, 它们被封装在 BasicFileAttributes 接口中, 这些属性与上述信息有部分重叠。基本文件属性包括:

  • 5.4.1)创建文件, 最后一次访问以及最后一次修改时间;
  • 5.4.2)文件时常规文件, 目录还是符号链接, 或者都不是;
  • 5.4.3)文件大小;
  • 5.4.4)文件主键, 这是某种类的对象, 具体所属类与文件系统相关, 有可能是文件的唯一标识符,也有可能不是;
  • 5.4.5)要获取这些属性,调用
    BasicFileAttributes attributes = files.readAttributes(path, BasicFileAttributes.class);

5.5) 如果你了解到用户的文件系统兼容 POSIX, 可以获取一个 PosiXFileAttributes 实例:
PosiXFileAttributes attributes = files.readAttributes(path, PosiXFileAttributes.class);
然后从中找到组拥有者, 拥有者,组,以及访问权限;

这里写图片描述


【6】 迭代目录中的文件

6.1)problem+solution

  • 6.1.1)problem: 旧File 类有一个方法,用来获取由一个目录的所有文件构成的数组, 当目录包含大量的文件时,方法性能非常低;
  • 6.1.2)solution: File类设计了一个方法, 产生一个 Iterable 对象, 如:
    try(DirectoryStream entries = Files.newDirectoryStream(dir))
    {
    for(Path entry : entries)
    process entries
    }
  • 6.1.3)try 语句块用来确保目录流可以被正确关闭。访问目录中的项并没有具体的顺序, 可以用 glob 模式来过滤:(干货——带资源的try语句块)
    try(DirectoryStream entries = Files.newDirectoryStream(dir, “*.java”));

这里写图片描述

  • Warning)如果使用 Windows 的 glob 语法, 则必须对反斜杠转移两次:一次为 glob 语法转义, 一次为java 字符串转义:Files.newDirectoryStream(dir, “C:\\”)

这里写图片描述

6.2)如果想要访问某个目录的子孙成员, 转而调用 walkFileTree 方法, 并向其传递一个 FileVisitor 类型的对象, 这个对象会得到下面通知:

  • 6.2.1)在遇到一个文件或目录时: FileVisitResult visitFile(T path, BasicFileAttributes attrs)
  • 6.2.2) 在一个目录被处理前: FileVisitResult preVisitFile(T dir, IOException ex)
  • 6.2.3) 在一个目录被处理后: FileVisitResult postVisitFile(T dir, IOException ex)
  • 6.2.4) 在试图访问文件或目录时发生错误, 例如没有权限打开目录: FileVisitResult visitFileFailed(path, IOException)

6.3) 对上述每种情况, 都可以指定是否希望执行下面的操作:

  • 6.3.1)继续访问下一个文件: FileVisitResult.CONTINUE;
  • 6.3.2)继续访问,但不在访问这个目录下的任何项了: FileVisitResult.SKIP_SUBTREE;
  • 6.3.3)继续访问, 但是不在访问这个文件的兄弟文了: FileVisitResult.SKIP_SIBLINES;
  • 6.3.4)终止访问: FileVisitResult.TRIMINATE ;

6.4) 当有任何方法抛出异常时, 就会终止访问, 而这个异常会从 walkFileTree 方法中抛出;

  • Attention) FileVisitor 接口是泛化类型, 但是你也太可能会使用 除开 FileVisit 之外的东西; walkFileTree 方法可以接收 FileVisitor

【7】 ZIP 文件系统

7.1)建立一个文件系统, 包含 ZIP 文档中的所有文件;
FileSystem fs = FileSystems.newFIleSystem(Paths.get(zipname), null);

  • 7.1.1)如果知道文件名,从ZIP 文档中复制出这个文件就变得很容易:
    Files.copy(fs.getPath(sourceName), targetPath);
  • 7.1.2)要列出ZIP 文档中的所有文件, 可以遍历文件树:
FileSystem fs = FileSystems.newFIleSystem(Paths.get(zipname), null)
Files.walkFileTree(fs,.getPath("/"), new SimpleFileVisitor<Path>(){public FileVisitResult visitFile(Path file , BasicFIleAttributes attrs){println(file);return FileVisitResult.CONTINUE;}}
)

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阅读副本和Spring Data第2部分:配置基础项目

在上一篇文章中&#xff0c;我们使用相同的数据设置了多个PostgreSQL实例。 下一步将是使用这两个服务器来配置spring项目。 如前所述&#xff0c;由于我们使用完全相同的数据库&#xff0c;因此我们将使用Spring Boot JPA帖子中的一些代码。 这将是我们的gradle构建文件 pl…

java生成UUID通用唯一识别码

一、UUID概述UUID含义是通用唯一识别码 (Universally Unique Identifier)&#xff0c;这是一个软件建构的标准&#xff0c;也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。 UUID 的目…

android 项目部署,Android发布项目到JCenter

JCenter是什么大家应该都用过各种各样的Github上的第三方开源组件。类似这种效果的compile wang.yuchao.demoforjcenterlibrary:DemoForJCenterLibraryModel:1.2.5我们会比较好奇Android Studio 是从哪里得到这个类库的&#xff1f;Android Studio是从build.gradle里面定义的Ma…

java流与文件——对象流和序列化

【0】README 0.1&#xff09; 本文描述转自 core java volume 2&#xff0c; 旨在理解 java流与文件——对象流和序列化 的相关知识&#xff1b; 0.2&#xff09; for source code , please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdva…

maven 版本号插件_测试Maven版本插件自动递增版本号

maven 版本号插件抽象 Maven版本插件是一个非常强大的工具&#xff0c;我在很大程度上依赖于它来协调软件版本。 通常&#xff0c;软件发行版本号遵循简单的1.0.0.0-SNAPSHOT格式。 但是最近我需要在版本号中添加一个限定符&#xff0c;例如1.0-beta-SNAPSHOT或1.0.0-fix-bug-d…

java中Date

在类 Date 所有可以接受或返回年、月、日期、小时、分钟和秒值的方法中&#xff0c;将使用下面的表示形式&#xff1a;年份 y 由整数 y - 1900 表示。月份由从 0 至 11 的整数表示&#xff1b;0 是一月、1 是二月等等&#xff1b;因此 11 是十二月。日期&#xff08;一月中的某…

如何配置android的adb环境变量,如何配置adb环境变量?win7配置adb环境变量的方法...

本文教程小编分享就是win7系统配置adb环境变量的方法&#xff0c; windows7系统 电脑安装adb工具时&#xff0c;提示“adb不是内部或外部命令”这时候我们需要重新配置adb环境变量&#xff0c;那么win7系统怎么配置adb环境变量&#xff1f;网上介绍配置adb环境变量的方法比较少…

jep290涉及jdk版本_JDK 14 / JEP 305模式匹配“ Smart Casts”实例

jep290涉及jdk版本我通常将Java代码中instanceof运算符的存在视为“ 红色标志 ”&#xff0c;这意味着在某些情况下使用instanceof不一定是错误的&#xff0c;但是使用它有时表示可以通过更干净的方式解决设计问题&#xff0c;如所述本文结尾处引用的一些资源中的内容&#xff…

java中Date与DateFormat的格式输出

一、DateFormat java.text.DateFormat 使用 getDateInstance 来获取该国家/地区的标准日期格式。另外还提供了一些其他静态工厂方法。使用 getTimeInstance 可获取该国家/地区的时间格式。使用 getDateTimeInstance 可获取日期和时间格式。可以将不同选项传入这些工厂方法&…

二叉堆的操作总结(insert+deleteMin+increaseKey+decreaseKey+percolateDown+percolateUp)

【0】README 本文idea 均为原创&#xff0c; for source code, please visit https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter6/p140_binaryheap_conclusion 【1】insert操作 // Attention, the index of the heap starts from 1 void …

aws生态系统集成商_通过通用数据访问扩展AWS生态系统

aws生态系统集成商Amazon Web Services&#xff08;AWS&#xff09;可帮助组织托管和管理其数据流程&#xff0c;例如构建数据可视化和执行ETL任务。 在CData&#xff0c;我们可以轻松地将AWS Services与异构业务应用程序和分布式数据存储连接起来&#xff0c;以最终帮助企业对…

HTML.parser和正则解析,正则表达式+HTMLParser使用详.ppt

getText:/body getText: getText:/htmlgetText:除了前面3.2中输出的几个Tag&#xff0c;其余的Tag都在这里了。 3.4 XorFilter 把前面的AndFilter换成NotFilter测试代码&#xff1a; NodeFilter filterID new HasAttributeFilter( "id" );NodeFilter filterChild n…

FileDescriptor的作用

一、FileDescriptor 文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄&#xff0c;该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的 FileInputStream 或 FileOutputStream。 二、静态标准文件描述…

java流与文件——内存映射文件

【0】README 0.1&#xff09; 本文描述转自 core java volume 2&#xff0c; 旨在理解 java流与文件——内存映射文件 的相关知识&#xff1b; 0.2&#xff09;内存映射文件的目的是&#xff1a; 提高访问速度&#xff0c; 缓冲区Buffer&#xff1b; 0.3&#xff09; 本文干…

java 函数式编程 示例_功能Java示例 第8部分–更多纯函数

java 函数式编程 示例这是第8部分&#xff0c;该系列的最后一部分称为“示例功能Java”。 我在本系列的每个部分中开发的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在上一期文章中&#xff0c;我们已经使用Vavr库看到了一些模式匹配&#xff0c;并且还将故障也视…

html加css作品,我的影视作品,如何在博客园发布带有CSS样式的HTML

总结一下&#xff0c;我做过的视频&#xff1a;(顺便试试在博客园如何发HTML网页)发布网页总结&#xff1a;HTML可以正常发送&#xff0c;但最好将你要发布的html文件放在一个带有ID的div中&#xff0c;这样方便后期添加样式时通过ID添加&#xff0c;不会影响到网页中的其他布局…

FileInputStream

java.ioClass FileInputStream java.lang.Object java.io.InputStream java.io.FileInputStream 所有已实现的接口: Closeable public class FileInputStream extends InputStream FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。 Fil…

android console命令,我们可以通过两种方式进入Android的console: 1. 直接执行命令emulator -shell; 2....

Don’t use /usr 这样子编译出来的busybox才不会安装到你主机的/usr目录下。一定要选上。4 执行make编译源码. 如果编译过程中产生无法找到头文件的错误, 可指定交叉编译器用到的头文件所在路径. 如 $make -I./home/jo/tool/arm-2008q3/arm-none-linux-gnueabi/lib…

selenium 示例_Selenium测试中所需的功能和示例

selenium 示例所需功能是用于声明一组基本要求&#xff08;例如浏览器&#xff0c;操作系统&#xff0c;浏览器版本等的组合&#xff09;的类&#xff0c;以对Web应用程序执行自动跨浏览器测试。 当我们尝试通过Selenium自动化测试来自动化测试脚本时&#xff0c;我们需要考虑…

java流与文件——正则表达式

【0】README 0.1&#xff09; 本文描述转自 core java volume 2&#xff0c; 旨在理解 java流与文件——正则表达式 的相关知识&#xff1b; 0.2&#xff09; there are my original source code below, and for them , please visit https://github.com/pacosonTang/core-ja…