Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Java从文本文件随机读取并打印指定行数内容_创想鸟

Java从文本文件随机读取并打印指定行数内容

Java从文本文件随机读取并打印指定行数内容

本文旨在指导读者如何使用java程序从文本文件中高效地读取多组固定行数的内容(如诗歌),并随机选择其中一组进行打印。教程将详细介绍如何利用`files.readalllines`、`random`和`list.sublist`等核心api,实现文件的整体读取、随机索引的生成以及特定内容块的提取与输出,同时提供完整的代码示例和实践注意事项。

在许多应用场景中,我们可能需要从包含多条结构化记录的文本文件中,随机抽取并展示其中一条记录。例如,从一个包含多首诗歌的文本文件中,随机选择并打印一首完整的诗歌。本教程将详细阐述如何在Java中实现这一功能,核心在于高效地读取文件内容、生成随机索引以及精准地截取所需行。

核心概念与工具

实现此功能主要依赖以下Java核心API:

java.nio.file.Files.readAllLines(Path path): 这是Java NIO.2提供的一个便捷方法,能够一次性将指定文件的所有行读取到一个 List 中。相比传统的 BufferedReader 逐行读取,它在处理小到中等大小文件时更为简洁高效,并且会自动处理资源的关闭。java.util.Random: 用于生成伪随机数。通过 nextInt(int bound) 方法,可以生成一个介于0(包含)和指定bound(不包含)之间的随机整数,这对于随机选择一个索引至关重要。java.util.List.subList(int fromIndex, int toIndex): 此方法返回列表中指定 fromIndex(包含)和 toIndex(不包含)之间部分的视图。它提供了一种高效的方式来获取列表的子序列,而无需创建新的完整列表副本。

实现步骤详解

我们将通过一个具体的例子来演示如何从一个包含多首五行诗的文本文件中,随机抽取并打印其中一首。

1. 准备数据文件

首先,创建一个名为 text.txt 的文本文件,其中包含多首诗歌,每首诗歌固定为5行。例如:

立即学习“Java免费学习笔记(深入)”;

这是第一首诗的第一行这是第一首诗的第二行这是第一首诗的第三行这是第一首诗的第四行这是第一首诗的第五行这是第二首诗的第一行这是第二首诗的第二行这是第二首诗的第三行这是第二首诗的第四行这是第二首诗的第五行这是第三首诗的第一行这是第三首诗的第二行这是第三首诗的第三行这是第三首诗的第四行这是第三首诗的第五行

将此文件放置在项目可访问的路径下,例如 src/main/resources/text.txt 或与你的Java源文件同级。

2. 定义常量

为了提高代码的可读性和可维护性,我们应该将每首诗歌的行数定义为一个常量。

private static final int POEM_LINES_LENGTH = 5; // 每首诗歌的固定行数

3. 读取文件所有行

使用 Files.readAllLines() 方法将整个文件的内容一次性读取到一个 List 中。

import java.nio.file.Files;import java.nio.file.Paths;import java.io.IOException;import java.util.List;import java.util.Random;import java.io.File;// ...File file = new File("src/main/java/org/example/text.txt"); // 替换为你的文件路径List allLines = Files.readAllLines(Paths.get(file.getAbsolutePath()));

4. 计算随机诗歌索引

在读取所有行之后,我们需要确定文件中有多少首完整的诗歌,然后从中随机选择一首。

int totalPoems = allLines.size() / POEM_LINES_LENGTH; // 计算完整的诗歌数量if (totalPoems == 0) {    System.out.println("文件中没有足够的行来构成一首完整的诗歌。");    return;}int randomPoemIndex = new Random().nextInt(totalPoems); // 随机选择一首诗歌的索引 (0到totalPoems-1)

5. 确定诗歌起止行

根据随机选择的诗歌索引和每首诗歌的固定行数,计算出该诗歌在 allLines 列表中的起始和结束索引。

int startIndex = randomPoemIndex * POEM_LINES_LENGTH; // 随机诗歌的起始行索引int endIndex = startIndex + POEM_LINES_LENGTH;       // 随机诗歌的结束行索引 (不包含)

6. 提取并打印诗歌

最后,使用 List.subList() 方法提取指定范围的行,并遍历打印。

List randomPoemLines = allLines.subList(startIndex, endIndex);System.out.println("随机选择的诗歌:");for (String line : randomPoemLines) {    System.out.println(line);}

完整示例代码

将以上步骤整合,得到一个完整的Java程序:

import java.io.File;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Paths;import java.util.List;import java.util.Random;public class RandomPoemPrinter {    private static final int POEM_LINES_LENGTH = 5; // 每首诗歌的固定行数    public static void main(String[] args) {        // 定义文件路径,请根据实际情况修改        // 建议使用相对路径,例如 "src/main/resources/text.txt"        // 或者直接使用文件名,如果文件与运行的jar包在同一目录        File file = new File("src/main/java/org/example/text.txt");         try {            // 1. 读取文件所有行            List allLines = Files.readAllLines(Paths.get(file.getAbsolutePath()));            // 2. 检查文件是否为空或行数不足            if (allLines.isEmpty()) {                System.out.println("文件为空,无法读取诗歌。");                return;            }            if (allLines.size() < POEM_LINES_LENGTH) {                System.out.println("文件行数不足 " + POEM_LINES_LENGTH + " 行,无法构成一首完整的诗歌。");                return;            }            // 3. 计算完整的诗歌数量            int totalPoems = allLines.size() / POEM_LINES_LENGTH;            if (totalPoems == 0) {                System.out.println("文件中没有足够的行来构成一首完整的诗歌。");                return;            }            // 4. 随机选择一首诗歌的索引            Random random = new Random();            int randomPoemIndex = random.nextInt(totalPoems); // 0 到 totalPoems-1            // 5. 确定诗歌在列表中的起止行索引            int startIndex = randomPoemIndex * POEM_LINES_LENGTH;            int endIndex = startIndex + POEM_LINES_LENGTH; // subList的endIndex是独占的            // 6. 提取并打印随机选择的诗歌            System.out.println("--- 随机选择的第 " + (randomPoemIndex + 1) + " 首诗歌 ---");            List randomPoemLines = allLines.subList(startIndex, endIndex);            for (String line : randomPoemLines) {                System.out.println(line);            }            System.out.println("-------------------------------------");        } catch (IOException e) {            System.err.println("读取文件时发生错误:" + e.getMessage());            e.printStackTrace();        } catch (Exception e) {            System.err.println("程序运行中发生未知错误:" + e.getMessage());            e.printStackTrace();        }    }}

注意事项与最佳实践

文件路径处理:在生产环境中,硬编码文件路径不是最佳实践。应考虑将文件路径作为程序参数、配置文件或环境变量来传递。使用 Paths.get(file.getAbsolutePath()) 确保 File 对象转换为 Path 对象时路径的准确性。如果文件位于项目的资源目录(如 src/main/resources),可以通过 ClassLoader.getResourceAsStream() 来读取,这样在打包成JAR文件后也能正确访问。异常处理:文件操作(如 Files.readAllLines())可能会抛出 IOException。务必使用 try-catch 块来捕获并妥善处理这些异常,例如打印错误信息或记录日志。在示例中,我们添加了对文件为空或行数不足以构成一首诗歌的检查,这增强了程序的健壮性。数据完整性检查:如果文本文件的总行数不是 POEM_LINES_LENGTH 的整数倍,那么 allLines.size() / POEM_LINES_LENGTH 会向下取整,这意味着最后不足一首诗歌的行将被忽略。这通常是可接受的,但如果需要处理这些零散的行,则需要额外的逻辑。Random 实例:在 main 方法中创建 new Random() 实例是没问题的。如果在一个循环中频繁地需要生成随机数,且对性能有较高要求,可以考虑将 Random 实例创建在循环外部并复用。内存消耗:Files.readAllLines() 会将整个文件内容加载到内存中。对于非常大的文件(例如几GB),这可能会导致内存溢出(OutOfMemoryError)。在这种情况下,应考虑使用 Files.lines() 返回 Stream 进行流式处理,或者传统的 BufferedReader 逐行读取,并维护一个固定大小的缓冲区来存储当前正在处理的诗歌行。

总结

通过本教程,我们学习了如何利用Java NIO.2的 Files.readAllLines() 方法高效读取文本文件,结合 java.util.Random 生成随机索引,并使用 List.subList() 准确提取指定行数的文本块。这种方法简洁、高效,并且易于理解和维护,适用于从结构化文本文件中随机抽取固定大小数据块的多种场景。在实际应用中,务必考虑文件路径、异常处理和潜在的内存消耗问题,以确保程序的健壮性和性能。

以上就是Java从文本文件随机读取并打印指定行数内容的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/204549.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
mysql如何启用query cache
上一篇 2026年9月20日 23:41:07
事务(Transaction)处理与并发控制
下一篇 2026年9月20日 23:45:06

相关推荐

  • Debian怎样实现快速回收

    Debian怎样实现快速回收Debian怎样实现快速回收Debian怎样实现快速回收Debian怎样实现快速回收

    优化Debian系统,释放磁盘空间,提升系统性能,可以通过以下方法快速实现: 一、清除无用软件包 使用 apt-get autoremove 命令卸载不再需要的软件包及其依赖项。使用 apt clean 和 apt autoclean 清理apt包管理器的缓存文件,释放更多空间。 二、删除旧内核版本…

    2026年9月25日 • 用户投稿
    000
  • Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​

    Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​

    用 deepseek 满血版 + copy.ai 的模板能高效产出高质量文案;deepseek 擅长理解和生成内容,copy.ai 提供成熟模板,两者结合保障结构与创意;操作时先选 aida、pas、bab 等高频率模板,再将产品信息与模板一同输入 deepseek 生成初稿;使用时需调整模板灵活性…

    2026年9月25日 • 用户投稿
    000
  • sublime如何高亮vue文件语法 _sublime Vue语法高亮方法

    sublime如何高亮vue文件语法 _sublime Vue语法高亮方法sublime如何高亮vue文件语法 _sublime Vue语法高亮方法sublime如何高亮vue文件语法 _sublime Vue语法高亮方法sublime如何高亮vue文件语法 _sublime Vue语法高亮方法

    安装Vue Syntax Highlight插件可让Sublime Text正确高亮.vue文件,支持template、script和style区块的语法着色,提升编辑体验。 要让 Sublime Text 正确高亮 Vue 文件语法,关键是将 .vue 文件识别为支持的语法格式。Vue 单文件组件…

    2026年9月25日 • 用户投稿
    200
  • 主板对整机性能的影响究竟有多大?

    主板对整机性能的影响究竟有多大?主板对整机性能的影响究竟有多大?主板对整机性能的影响究竟有多大?主板对整机性能的影响究竟有多大?

    主板虽不直接提升性能,却决定硬件潜力发挥。其核心作用在于稳定供电、高效数据传输与良好散热,影响CPU、内存、显卡等部件的运行效率和系统稳定性。选择时应重点关注芯片组(如Z790、B650)、供电模块(VRM设计)、内存支持(类型、频率)及扩展接口(PCIe、M.2数量与版本)。预算有限时,主板投入应…

    2026年9月25日 • 用户投稿
    000
  • DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理

    DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理

    要实现deepseek的自动扩缩容,核心在于根据负载动态调整资源。1. 首先确定监控指标,如gpu利用率、请求延迟、并发数等,优先关注服务压力关键指标;2. 设置扩缩策略,基于规则适用于周期性负载,基于预测适合波动无规律场景;3. 选择资源类型,spot实例适合容忍中断任务,按量付费适合高可用服务,…

    2026年9月25日 • 用户投稿
    000
  • 黑莓iSpeech多国翻译工具

    黑莓iSpeech多国翻译工具黑莓iSpeech多国翻译工具黑莓iSpeech多国翻译工具黑莓iSpeech多国翻译工具

    还记得第一次掏出黑莓手机时,旁人疑惑地问:“这是一款电子词典吗?”不禁让人莞尔。事实上,凭借其优秀的物理键盘和流畅的操作体验,黑莓本就是理想的随身翻译工具。而ispeech_translator正是一款集翻译与词典于一体的多语言软件,专为提升移动沟通效率而生。这款免费在线应用功能全面、操作简单,安装…

    2026年9月25日 • 用户投稿
    200
  • Hadoop MapReduce实现累计电量数据的最大小时耗电量计算

    本文详细介绍了如何使用Hadoop MapReduce从累计电量读数中计算出所有住户和所有日期内的最大小时耗电量。教程将分析原始代码的问题,包括自定义Writable类的序列化错误和逻辑缺陷,并提供一个基于两阶段MapReduce任务的完整解决方案,涵盖自定义数据类型、Mapper、Reducer的…

    2026年9月25日
    000
  • Debian邮件服务器如何进行定制开发

    Debian邮件服务器如何进行定制开发Debian邮件服务器如何进行定制开发Debian邮件服务器如何进行定制开发Debian邮件服务器如何进行定制开发

    本文介绍如何在Debian系统上构建和定制邮件服务器。 这包括软件安装、配置和安全增强等关键步骤。 一、软件安装 首先,安装Postfix和Dovecot邮件服务器软件: sudo apt updatesudo apt install postfix dovecot-imapd dovecot-po…

    2026年9月25日 • 用户投稿
    000
  • sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法

    sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法

    点击状态栏语言名可快速切换语法类型,立即应用高亮规则;2. 用Ctrl+Shift+P或Cmd+Shift+P打开命令面板,输入Set Syntax选择目标语言;3. 通过“Open all with current extension as…”设置默认语法关联,或手动编辑配置文件,使特…

    2026年9月25日 • 用户投稿
    200
  • Stable Diffusion精炼关键词公式:构图+主体+细节+风格+画质

    Stable Diffusion精炼关键词公式:构图+主体+细节+风格+画质Stable Diffusion精炼关键词公式:构图+主体+细节+风格+画质Stable Diffusion精炼关键词公式:构图+主体+细节+风格+画质Stable Diffusion精炼关键词公式:构图+主体+细节+风格+画质

    stable diffusion关键词公式的核⼼是通过结构化描述提升图像生成的精准度和表现力,其核心要素包括构图、主体、细节、风格和画质。1. 构图决定画面布局与视角,涵盖视角(如全身像、特写)、取景范围(如黄金分割)、景深(如浅景深突出主体)、光线(如伦勃朗光)和透视(如一点透视);2. 主体是画…

    2026年9月25日 • 用户投稿
    000
  • AMD下代Zen6 CPU大变革!转向全新D2D互连:能效延迟双飞跃

    AMD下代Zen6 CPU大变革!转向全新D2D互连:能效延迟双飞跃AMD下代Zen6 CPU大变革!转向全新D2D互连:能效延迟双飞跃AMD下代Zen6 CPU大变革!转向全新D2D互连:能效延迟双飞跃AMD下代Zen6 CPU大变革!转向全新D2D互连:能效延迟双飞跃

    9月29日消息,据最新报道,amd正计划在未来的zen 6处理器中采用全新的d2d(die-to-die)互连技术,以替代沿用多年的serdes方案,而这一变革的初步迹象已在即将推出的strix halo apu上显现。 自Zen 2架构以来,AMD一直依赖SERDES PHY技术实现多个CCD(计…

    2026年9月25日 • 用户投稿
    100
  • 公众号文章如何插入图片_在公众号文章中插入图片的正确方法

    公众号文章如何插入图片_在公众号文章中插入图片的正确方法公众号文章如何插入图片_在公众号文章中插入图片的正确方法公众号文章如何插入图片_在公众号文章中插入图片的正确方法公众号文章如何插入图片_在公众号文章中插入图片的正确方法

    插入图片可提升公众号文章可读性与美观度,常用方法有四种:一、通过微信后台直接上传,操作简单;二、使用秀米等第三方工具排版后同步,功能丰富;三、用Markdown编辑并转HTML导入,适合高效写作;四、借助壹伴等工具批量上传,提升多图处理效率。 如果您在编辑公众号文章时希望增强内容的可读性和吸引力,插…

    2026年9月25日 • 用户投稿
    000
  • 微信小店保证金提现多久到账?微信小店2000保证金怎么退回

    微信小店作为一种新型的电子商务模式,受到越来越多创业者的青睐。在开设微信小店的过程中,保证金是必不可少的一环。许多商家对于微信小店保证金提现的流程及到账时间存在疑问。本文将为您详细解析微信小店保证金提现的相关问题,帮助您更好地了解这一环节。 一、微信小店保证金提现流程 1. 登录微信小店后台 您需要…

    2026年9月25日
    000
  • 如何将一键PHP环境迁移到新电脑_环境数据迁移教程

    先完整备份旧环境的网站文件、数据库和配置,再在新电脑安装相同版本的一键PHP环境,最后还原数据与配置实现迁移。 如果你在旧电脑上使用一键PHP环境(如phpStudy、XAMPP、WampServer等),想把整个开发环境和数据迁移到新电脑,可以按以下步骤操作,确保网站、数据库、配置全部完整转移。 …

    2026年9月25日
    000
  • 显卡外接供电接口规格如何影响超频潜力?

    显卡供电接口类型与数量直接决定其最大供电能力,进而影响超频潜力。PCIe插槽提供75W,6-pin接口额外提供75W,8-pin提供150W,双8-pin可达300W外接供电,加上PCIe的75W,总供电达375W,显著高于单8-pin的225W上限。更多更高规格接口意味着更高的功耗预算,使GPU在…

    2026年9月25日
    000
  • Debian系统与GitLab的数据同步问题怎么处理

    Debian系统与GitLab的数据同步问题怎么处理Debian系统与GitLab的数据同步问题怎么处理Debian系统与GitLab的数据同步问题怎么处理Debian系统与GitLab的数据同步问题怎么处理

    确保Debian系统上GitLab数据的安全性和可恢复性,定期备份至关重要。本文介绍如何利用GitLab内置工具进行备份,并提供一些最佳实践。 利用GitLab内置备份工具 GitLab自带的gitlab-backup工具可以备份整个GitLab实例,包含代码库、数据库和配置文件等。 备份指令: s…

    2026年9月25日 • 用户投稿
    100
  • LINUX怎么查找包含特定内容的文件_LINUX使用grep命令查找文件内容

    LINUX怎么查找包含特定内容的文件_LINUX使用grep命令查找文件内容LINUX怎么查找包含特定内容的文件_LINUX使用grep命令查找文件内容LINUX怎么查找包含特定内容的文件_LINUX使用grep命令查找文件内容LINUX怎么查找包含特定内容的文件_LINUX使用grep命令查找文件内容

    使用grep命令可快速查找Linux系统中包含特定文本的文件。首先通过grep -r “关键词” /路径/ 实现目录递归搜索,如grep -r “error” /home/user/;添加-i参数忽略大小写,-n显示行号。结合find与grep可按文件…

    2026年9月25日 • 用户投稿
    100
  • 2025年6月中国车型销量TOP20:小米SU7暂列第十

    2025年6月中国车型销量TOP20:小米SU7暂列第十2025年6月中国车型销量TOP20:小米SU7暂列第十2025年6月中国车型销量TOP20:小米SU7暂列第十2025年6月中国车型销量TOP20:小米SU7暂列第十

    近日,有机构整理了乘联分会零售数据,列出了2025年6月中国汽车市场上销量最高的20款车型: 第一名,特斯拉Model Y,销量4.48万辆 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 第三名,比亚迪秦PLUS新能源,销量3.86万辆 第…

    2026年9月25日 • 用户投稿
    000
  • Java布尔方法逻辑陷阱:比较运算符与预期行为不符的调试指南

    Java布尔方法逻辑陷阱:比较运算符与预期行为不符的调试指南Java布尔方法逻辑陷阱:比较运算符与预期行为不符的调试指南Java布尔方法逻辑陷阱:比较运算符与预期行为不符的调试指南Java布尔方法逻辑陷阱:比较运算符与预期行为不符的调试指南

    本教程深入探讨Java布尔方法中因比较运算符使用不当导致的常见逻辑错误。通过分析一个kindaLiked方法的具体案例,我们揭示了代码中实际条件(likes retweets)之间的差异,并提供了精确的修正方案。文章强调了在编写布尔逻辑时,精确定义条件、细致测试以及正确选择比较运算符的重要性,以确保…

    2026年9月25日 • 用户投稿
    100
  • sublime怎么设置鼠标滚轮速度_sublime滚动灵敏度调整方法

    sublime怎么设置鼠标滚轮速度_sublime滚动灵敏度调整方法sublime怎么设置鼠标滚轮速度_sublime滚动灵敏度调整方法sublime怎么设置鼠标滚轮速度_sublime滚动灵敏度调整方法sublime怎么设置鼠标滚轮速度_sublime滚动灵敏度调整方法

    Sublime Text 无法直接调节滚轮速度,需通过系统设置、插件或鼠标驱动优化。1. 调整操作系统鼠标滚轮设置:Windows 修改“一次滚动的行数”,macOS 调节“滚动速度”滑块,Linux 使用桌面设置或 xinput 命令;2. 安装 SmoothScroll 插件提升滚动流畅度,支持…

    2026年9月25日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信