Java NIO Files类读取文件流方式详解

2023-11-19

Java NIO Files类读取文件流方式详解

Files类原理概述

java.nio.file.Files是Java标准库提供的一个工具类,用于操作文件和目录。它提供了一系列静态方法,可以用于创建、复制、删除、移动、重命名、读取、写入文件和目录等常见的文件系统操作。同时,它也提供了一些高级特性,如文件系统监控、文件属性操作等。在Java 7中引入,用于替代旧的java.io.File类。

Java NIO中的Files类提供了许多静态方法,用于操作文件和目录。它是Java NIO中处理文件的核心组件之一,基于Java NIO的FileChannelPath组件实现。在使用Files类读取文件时,主要涉及到以下几个核心方法:

  • Path get(String first, String... more):根据指定的路径字符串创建一个Path对象。
  • byte[] readAllBytes(Path path):读取指定文件的所有字节到一个字节数组中。
  • List<String> readAllLines(Path path, Charset cs):读取指定文件的所有文本行到一个列表中。
  • Stream<String> lines(Path path, Charset cs):返回一个Stream对象,用于读取指定文件的所有文本行。

使用Files类读取文件的实现原理主要涉及到PathFileChannel两个核心组件。当我们使用Files类读取文件时,首先需要使用Path对象创建一个文件路径,然后使用FileChannel打开一个文件通道,最后读取文件的内容到指定的数据结构中。

以下是使用Java NIO读取文件的步骤:

  1. 通过java.nio.file.Path类创建文件路径对象,例如:Path path = Paths.get("file.txt");
  2. 通过java.nio.file.Files类读取文件内容,例如:byte[] bytes = Files.readAllBytes(path);List<String> lines = Files.readAllLines(path);
    • readAllBytes()方法可以一次性读取文件的所有字节,并返回一个byte[]数组。
    • readAllLines()方法可以逐行读取文本文件的内容,并返回一个List<String>对象,其中每个元素表示文件中的一行文本数据。
  3. 对于较大的文件,可以使用java.nio.file.Files类的newByteChannel()方法创建一个java.nio.channels.FileChannel对象,并使用ByteBuffer类缓存内容,以提高效率。例如:
Path path = Paths.get("file.txt");
try (FileChannel channel = FileChannel.open(path)) {
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    while (channel.read(buffer) > 0) {
        buffer.flip();
        // 读取buffer中的内容
        buffer.clear();
    }
} catch (IOException e) {
    e.printStackTrace();
}

在上述示例中,我们使用FileChannel.open()方法打开一个文件通道,并使用ByteBuffer.allocate()方法创建一个缓冲区,最后通过循环读取缓冲区中的内容。

注意在读取之前需要调用flip()方法将缓冲区从写模式切换到读模式,以便读取缓冲区中的内容。

案例

下面我们来看一个使用Java NIO的Files类读取文件的案例,假设我们有一个文本文件,需要按行读取其中的内容,并输出到控制台上。使用Java NIO的Files类可以轻松地实现这个功能,代码如下所示:

Path path = Paths.get("file.txt");
try {
	List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
	for (String line : lines) {
    	System.out.println(line);
	}
} catch (IOException e) {
	e.printStackTrace();
}

在上述代码中,我们首先使用Paths.get()方法创建一个Path对象,指定要读取的文件路径。然后使用Files.readAllLines()方法读取文件的所有文本行,返回一个包含所有文本行的列表。最后使用循环遍历列表,逐行输出文本内容到控制台上。

除了readAllLines()方法,Files类还提供了其他读取文件的方式,如readAllBytes()方法可以将文件的所有字节读取到一个字节数组中,lines()方法可以返回一个Stream对象,用于逐行读取文件内容。这些方法都可以轻松地实现对文件内容的读取和处理。

Path path = Paths.get("file.txt");
try {
    Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8);
    lines.forEach(line -> {
        String[] words = line.split("\\s+");
        System.out.println("Line: " + line + ", Word Count: " + words.length);
    });
} catch (IOException e) {
    e.printStackTrace();
}

在上述代码中,我们首先使用Paths.get()方法创建一个Path对象,指定要读取的文件路径。然后使用Files.lines()方法返回一个Stream对象,用于逐行读取文件内容。最后使用forEach()方法遍历Stream对象中的每一行文本内容,统计每行的单词个数并输出到控制台上。

forEach()方法中,我们首先使用split()方法将每行文本按空格分割成一个单词数组,然后通过length属性获取单词数组的长度,即为该行单词的个数。最后输出该行文本和单词个数到控制台上。

使用Files类的lines()方法可以轻松地实现对文本文件内容的逐行读取和处理,同时也可以根据具体需求对每行文本进行其他处理,如单词统计、文本匹配等。

小结

本文介绍了Java NIO中的Files类的原理和案例。通过使用PathFileChannel的高效读写机制,Files类可以大大提高文件读写的效率,尤其是在处理大文件时。同时,Files类还提供了其他读取文件的方式,可以更好地满足应用程序的需求。在实际开发中,可以根据具体需求选择合适的文件操作方式,来提高应用程序的性能和可靠性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java NIO Files类读取文件流方式详解 的相关文章

  • Java将字符串解析为double

    如何解析字符串中的这个 Double 00034800 变成 Double 值 最后两位数字实际上是小数点 所以我正在寻找的结果是348 00 是否有这样的格式可以与十进制格式一起使用 Well String s 00034800 doub
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 为什么在将 String 与 null 进行比较时会出现 NullPointerException?

    我的代码在以下行中出现空指针异常 if stringVariable equals null 在此语句之前 我声明了 stringVariable 并将其设置为数据库字段 在这个声明中 我试图检测该字段是否有null值 但不幸的是它坏了 有
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • 如何使用 Jersey 将嵌套列表封送为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

    我正在开发一个使用 Jersey 将对象转换为 JSON 的项目 我希望能够写出嵌套列表 如下所示 data one two three a b c 我想要转换的对象首先将数据表示为 gt gt 我认为 Jersey 会做正确的事情 以上输
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On

随机推荐

  • Debian 12 发布,迄今为止最佳 Linux 版本

    Debian 项目今天发布了 Debian 12 Bookworm 操作系统的最终版本 这是一个重大发布 带来了几个新功能 更新的组件和许多改进 凭借其长期稳定和安全的历史 Debian 12 备受全球开源爱好者的热切期待 这个新版本带来了
  • 图书馆管理系统开发(C# && Sql Server)

    图书馆管理系统 C S架构软件 开发 主要步骤 遇见问题 1 主要步骤 1 1 学习主干知识 大概懂得数据库相关sql语法 大概懂得C 语法 C 菜鸟教程 把基础篇看看 大概掌握 Net开发窗口界面 Net教程 然后可以实战一下项目 VS2
  • 将嘉立创中元件导出为AD封装库使用

    AD封装库的选择和元件的查找实在让人头大 我们不妨使用好嘉立创提供的丰富元器件库 如果想要找到想要的元件 可以直接去嘉立创EDA 标准版 的元件库中寻找 在符号类型中可以找到原理图文件 很奇怪 在嘉立创商城中直接搜索的话元器件会比在嘉立创E
  • python列表输出去掉引号_如何从导出的python列表中删除逗号、引号和圆括号?

    你们帮了我最后一个新手的忙 所以我想我会再问一次 现在 我的Python 3代码从CSV文件中获取数据 将数据存储为列表 创建该数据的排列 并以列格式将其导出回新的CSV文件 不幸的是 导出列表的格式不适合我的需要 我的问题是 如何在pyt
  • vue3.0项目报错:删除node包重新装报错

    前言 vue3 0的项目删除node包以后重新装项目 会报错 vue loader v16 找不到 安装以后下次再删包 再装会报错webpack的问题 解决办法 在新建项目后 打开pack json文件 找到 devDependencies
  • 【积累】Element-ui,el-dialog里面嵌入el-form,resetFields失效问题

    记一次element ui el dialog里面嵌入el form 使用resetFields方法初始化表单失效 问题记录 前提 当el form在一个el dialog中 dialog显示与否绑定变量 showDialog ref 为
  • 用DC-DC 升压降压以及产生负电压的原理及应用

    文章目录 前言 一 Boost和Buck电路 二 实际使用 1 DC DC芯片 2 DC DC芯片产生负电压 前言 在设计电源电路时经常会用到升压降压和负电压等电路 博主结合理论知识和实际应用加上自己理解 分享这篇文章 一 Boost和Bu
  • 设置无线路由器与有线网络在同一网段

    公司有两台路由器 一台连接internet的大路由器 一台无线路由器 两台路由器不在同一网段 所以无法实现互联互通 在一个局域网中很不方便 原设置 无线路由器的WAN口连接到大路由器上 插网线 无线路由器的WAN IP设置与大路由器一个网段
  • 【微信小程序】wx.request出现undefined

    偶现 天啦噜 一直困惑了很久的bug终于找到原因了 示例代码如下 wx request sucess function res if res statusCode 200 res data status 200 do something e
  • csdn中使用KaTeX给公式编号

    说明 csdn用的公式编辑器是Katex 并不是LaTeX 两者语法有些区别 比如LaTeX中的公式编号 begin equation 在KateX中就会解析错误 katex中 给公式编号用 tag 1 的形式 例如 E mc 2 tag
  • 【Threejs效果:挖空几何体】ThreeBSP实现墙体挖洞

    1 效果如下 2 代码如下 基本思路 1 创建两个mesh 一个墙体 一个窗户 2 然后取墙体和窗户的差集 将差集转换成几何体 3 根据几何体新建mesh 并贴纹理 依赖库有三个 import as THREE from three imp
  • CPU系统级验证——概览索引

    1 RISC V CPU核指令集验证分析 1 wujian100 1 SoC核分析 无剑100实际上是一款低功耗SoC 采用的CPU核是E902 core通过AHB总线与Icache相连 2 验证环境分析 通过 readmemh test
  • Nginx的alias的用法及与root的区别(转)

    http nginx org en docs http ngx http core module html alias http nginx org en docs http ngx http core module html root 以
  • Anaconda创建虚拟环境出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.ts解决办法

    使用Anaconda创建一个新的环境 执行 conda create n scrapyEnv python 3 6 结果出现了 CondaHTTPError HTTP 000 CONNECTION FAILED for url https
  • 电脑上有哪些好用的视频剪辑软件

    http www 360doc com content 18 0712 08 55889173 769741943 shtml 可以说 现在视频正日益成为营销和社交媒体的一个组成部分 这就是为什么会有视频编辑越来越火的原因 这已随着视频在当
  • matlab 从点云中移除隐藏点

    目录 一 功能概述 1 算法概述 2 主要函数 二 代码实现 三 结果展示 四 参考链接 一 功能概述 1 算法概述 该函数使用如下步骤从指定的视点确定点云中的可见点 1 将点云与中心位于视点的坐标系相关联 2 使用球形投影进行反演 创建一
  • nginx配置vue(history模式)

    问题的原因 项目本来使用 hash 的路由模式来部署 因为需求关系 现在要改成 history 的模式来部署了 路径上不要有 号 第一步 修改项目的 router index js 的配置 const router new VueRoute
  • modbus总线协议(一)modbus rtu

    一 介绍 Modbus协议由Modicon公司开发出来 现在Modbus是工业领域全球最流行的协议 硬件支持RS 232 RS 422 RS 485和以太网设备 应用在PLC DCS 智能仪表等工控领域 图片来源于网络 二 modbus协议
  • template 的使用

    插件介绍 template 是一个高性能的JavaScript模板引擎 插件特性 1 性能卓越 执行速度快 mustache 与 tmpl 的20多倍 2 支持运行时调试 可精准定位异常模板所在语句 3 对 NodeJS Express 有
  • Java NIO Files类读取文件流方式详解

    Java NIO Files类读取文件流方式详解 Files类原理概述 java nio file Files是Java标准库提供的一个工具类 用于操作文件和目录 它提供了一系列静态方法 可以用于创建 复制 删除 移动 重命名 读取 写入文