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

相关推荐

  • win11怎么校准笔记本电脑电池_Win11笔记本电池校准方法

    若Windows 11电池显示不准,可通过BIOS校准、手动充放电或第三方软件恢复精度。首先尝试BIOS中“Battery Calibration”功能,执行自动充放循环;若不支持,则手动充满后使用至自动关机再充满;最后可用BatteryInfoView等工具验证校准效果。 如果您发现Windows…

    2026年9月21日
    000
  • iPhone 17 Pro Max如何开启应用分身功能

    iPhone 17 Pro Max不支持原生应用分身,可通过官方企业版应用如“企业微信”或“QQ轻聊版”实现双开,此方法安全稳定且推荐优先使用;部分应用可能提供TestFlight测试版以支持多账号登录,但依赖开发者支持且存在不稳定性;第三方分身工具因企业证书易被吊销及隐私泄露风险,强烈不建议使用。…

    2026年9月21日
    000
  • Grok官方主页登录入口_Grok最新版官方网站地址

    Grok官方主页登录入口是grok.com,用户需通过X账号登录,该网站支持电脑和手机浏览器访问,界面简洁,可进行多轮对话,并与X平台深度关联,提供免费及高级订阅服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Grok官方主页登录入口…

    2026年9月21日
    000
  • 如何在服务器上优化mysql安装

    优化MySQL需从系统环境、配置参数、存储引擎到日常维护多层面入手,首先确保内存合理分配、选用XFS等高性能文件系统、关闭非必要服务并调整内核参数;其次在MySQL配置中优先使用InnoDB引擎,科学设置innodb_buffer_pool_size、innodb_log_file_size、max…

    2026年9月21日
    000
  • 在Java中静态方法能否被重写

    静态方法属于类而非实例,不参与运行时动态绑定,因此不能被重写;2. 子类定义同名静态方法时发生方法隐藏,调用时机由引用类型在编译阶段决定;3. 如示例所示,Parent p = new Child() 调用 p.display() 输出 “Parent static method&#82…

    2026年9月21日
    000
  • Linux怎么监控特定进程的运行状态

    Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态

    监控Linux进程需综合使用ps、top、htop、pgrep和systemctl等工具,结合资源占用、进程状态、日志输出和进程数量判断是否异常,并通过systemd的Restart机制或看门狗脚本实现自动重启,同时利用journalctl、sar、atop及Prometheus+Grafana等方…

    2026年9月21日 用户投稿
    000
  • Laravel中的服务容器(Service Container)是什么?

    laravel中的服务容器是框架的核心组件,充当服务定位器和依赖注入容器。1)它管理类及其依赖,简化依赖管理,提升代码可测试性和可维护性。2)服务容器是应用架构的基石,帮助拆分复杂业务逻辑成独立服务,提高代码灵活性和可扩展性。3)基本用法包括绑定和解析服务,如app()->bind(&#821…

    2026年9月21日
    100
  • 为什么VSCode的语法高亮有时会失效?

    语法高亮失效通常由语言模式识别错误、扩展冲突或配置问题导致。1. 检查右下角语言模式并手动切换为正确类型,确保文件有正确扩展名;2. 禁用近期安装的扩展或以 code –disable-extensions 启动排查冲突;3. 切换至默认主题并检查 settings.json 是否覆盖颜…

    2026年9月21日
    500
  • 在Java中变量和常量有什么区别

    变量的值可修改,常量(用final修饰)一旦赋值不可变;变量用于动态数据,常量用于固定值,如PI或配置参数。 在Java中,变量和常量的主要区别在于它们的值能否被修改。变量的值可以在程序运行过程中改变,而常量一旦赋值就不能再更改。 变量(Variable) 变量是用于存储数据的基本单元,其值在程序执…

    2026年9月21日
    100
  • mysql如何启用binlog日志

    MySQL启用binlog需修改配置文件添加log-bin和server-id,重启服务后执行SHOW VARIABLES LIKE ‘log_bin’验证是否为ON,确认启用。 MySQL启用binlog日志需要修改配置文件并重启服务,同时可进行简单验证确保生效。以下是具体…

    2026年9月21日
    000
  • Linux命令行如何查看登录用户

    Linux命令行如何查看登录用户Linux命令行如何查看登录用户Linux命令行如何查看登录用户Linux命令行如何查看登录用户

    答案是 who、w 和 users 命令用于查看Linux系统登录用户,其中 who 显示登录用户及终端信息,w 还显示用户正在执行的命令和系统负载,users 仅输出用户名列表。 在Linux命令行下,要查看当前系统上有哪些用户登录,最直接、最常用的命令包括 who 、 w 和 users 。它们…

    2026年9月21日 用户投稿
    100
  • 虚拟伴侣AI如何实现智能学习 虚拟伴侣AI自适应训练系统的优化指南

    虚拟伴侣AI如何实现智能学习 虚拟伴侣AI自适应训练系统的优化指南虚拟伴侣AI如何实现智能学习 虚拟伴侣AI自适应训练系统的优化指南虚拟伴侣AI如何实现智能学习 虚拟伴侣AI自适应训练系统的优化指南虚拟伴侣AI如何实现智能学习 虚拟伴侣AI自适应训练系统的优化指南

    通过强化学习、记忆网络、多模态融合、联邦学习与课程学习五大机制,构建虚拟伴侣AI的自适应训练系统:一、利用用户反馈信号驱动PPO算法优化对话策略,结合稀疏奖励补偿提升长期决策质量;二、建立增量式上下文记忆网络,以向量数据库存储并检索用户个性化信息,增强长期依赖建模能力;三、融合文本、语音、打字节奏等…

    2026年9月21日 用户投稿
    100
  • 《忍者龙剑传4》PS版画面对比!Pro有专属模式!

    《忍者龙剑传4》PS版画面对比!Pro有专属模式!《忍者龙剑传4》PS版画面对比!Pro有专属模式!《忍者龙剑传4》PS版画面对比!Pro有专属模式!《忍者龙剑传4》PS版画面对比!Pro有专属模式!

    《忍者龙剑传4》(ninja gaiden 4)作为首款深度适配索尼playstation 5 pro硬件特性的动作大作,已于10月21日正式发售。随着媒体评测全面解禁,游戏凭借极致的战斗体验与技术表现赢得广泛赞誉。 本作在标准版PS5与PS5 Pro上均展现出顶尖水准,但得益于更强的GPU与定制A…

    2026年9月21日 用户投稿
    100
  • iPhone 16 Pro如何设置不同铃声给联系人

    在iPhone 16 Pro上为特定联系人设置专属铃声和振动模式,只需进入“通讯录”编辑该联系人,选择“电话铃声”和“振动”选项进行自定义,还可单独设置“短信铃声”,所有设置通过iCloud同步保留。 给iPhone 16 Pro上的特定联系人设置专属铃声很简单,不需要用到电脑或第三方工具。你直接在…

    2026年9月21日
    100
  • 苹果手机密码忘记如何解决

    一、通过Apple ID重设密码 Apple ID是苹果用户的核心账户,可用于找回或重置iPhone的锁屏密码。操作流程如下: 尝试输入密码:在iPhone锁屏界面多次输入错误密码后,系统会提示“iPhone已停用,请稍后再试”。 选择“需要帮助”:当出现锁定提示时,屏幕上通常会显示“忘记密码”或“…

    2026年9月21日
    300
  • VSCode怎么编译运行视频_VSCode处理视频资源的扩展与操作指南

    VSCode通过扩展和外部工具支持视频处理。推荐使用Code Runner或ffmpeg-kit扩展运行FFmpeg命令,或结合Python(MoviePy/OpenCV)、Node.js(fluent-ffmpeg)等编程方式实现视频格式转换、裁剪等操作,具体工具选择取决于技能栈和需求。 VSCo…

    2026年9月21日
    100
  • mac怎么撤销已发送的信息_Mac撤销已发送信息方法

    答案:Mac上可通过“信息”应用在2分钟内撤回或编辑iMessage消息。操作步骤:1. 悬停消息气泡点击“…”;2. 选择“撤回”或“编辑”;3. 编辑最多5次,超限仅可撤回,对方消息同步删除。 如果您在Mac上使用信息应用发送了消息,但发现内容有误或需要撤回,可以在一定时间内执行撤销操作。此功能…

    2026年9月21日
    000
  • Windows系统下的兼容性问题

    windows兼容性问题严重是因为系统演进快、硬件和软件环境多样。处理此问题需:1.了解目标系统版本和配置;2.使用低版本api或兼容性模式;3.检测操作系统版本并调整程序行为;4.避免依赖特定版本的库,提供多版本安装包;5.考虑硬件依赖性,提供备选方案;6.进行跨版本性能测试和优化。 在Windo…

    2026年9月21日
    000
  • Linux如何限制用户执行特定命令

    Linux如何限制用户执行特定命令Linux如何限制用户执行特定命令Linux如何限制用户执行特定命令Linux如何限制用户执行特定命令

    首选sudo进行命令限制,因其灵活且可审计;通过visudo配置精确的用户权限,结合白名单、命令别名和!语法实现允许或拒绝特定命令;同时防范绕过手段如全路径执行、间接调用、脚本执行等,需多层防御并辅以日志监控。 在Linux环境中,限制用户执行特定命令,最直接有效且灵活的方法通常是利用 sudo 权…

    2026年9月21日 用户投稿
    000
  • 猎豹浏览器最新官方网址链接 猎豹浏览器平台入口直达官网首页

    猎豹浏览器最新官方网址是http://m.liebao.cn/,该网站提供安卓和iPhone版浏览器下载,具备双引擎加速、视频缓存、安全防护及个性化设置等功能。 猎豹浏览器最新官方网址链接在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来猎豹浏览器平台入口直达官网首页,感兴趣的网友一起随小编…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信