0

0

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

心靈之曲

心靈之曲

发布时间:2025-10-23 12:43:28

|

964人浏览过

|

来源于php中文网

原创

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

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

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

核心概念与工具

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

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

实现步骤详解

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

1. 准备数据文件

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

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

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

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

2. 定义常量

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

EasySub – AI字幕生成翻译工具
EasySub – AI字幕生成翻译工具

EasySub 是一款在线 AI 字幕生成器。 它提供AI语音识别、AI字幕生成、AI字幕翻译,本来就很简单的视频剪辑。

下载
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();
        }
    }
}

注意事项与最佳实践

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

总结

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

相关文章

全能打印神器
全能打印神器

全能打印神器是一款非常好用的打印软件,可以在电脑、手机、平板电脑等设备上使用。支持无线打印和云打印,操作非常简单,使用起来也非常方便,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

835

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

740

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

736

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

399

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.6万人学习

C# 教程
C# 教程

共94课时 | 6.9万人学习

Java 教程
Java 教程

共578课时 | 47.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号