
本文旨在指导读者如何使用java程序从文本文件中高效地读取多组固定行数的内容(如诗歌),并随机选择其中一组进行打印。教程将详细介绍如何利用`files.readalllines`、`random`和`list.sublist`等核心api,实现文件的整体读取、随机索引的生成以及特定内容块的提取与输出,同时提供完整的代码示例和实践注意事项。
在许多应用场景中,我们可能需要从包含多条结构化记录的文本文件中,随机抽取并展示其中一条记录。例如,从一个包含多首诗歌的文本文件中,随机选择并打印一首完整的诗歌。本教程将详细阐述如何在Java中实现这一功能,核心在于高效地读取文件内容、生成随机索引以及精准地截取所需行。
实现此功能主要依赖以下Java核心API:
我们将通过一个具体的例子来演示如何从一个包含多首五行诗的文本文件中,随机抽取并打印其中一首。
首先,创建一个名为 text.txt 的文本文件,其中包含多首诗歌,每首诗歌固定为5行。例如:
立即学习“Java免费学习笔记(深入)”;
这是第一首诗的第一行 这是第一首诗的第二行 这是第一首诗的第三行 这是第一首诗的第四行 这是第一首诗的第五行 这是第二首诗的第一行 这是第二首诗的第二行 这是第二首诗的第三行 这是第二首诗的第四行 这是第二首诗的第五行 这是第三首诗的第一行 这是第三首诗的第二行 这是第三首诗的第三行 这是第三首诗的第四行 这是第三首诗的第五行
将此文件放置在项目可访问的路径下,例如 src/main/resources/text.txt 或与你的Java源文件同级。
为了提高代码的可读性和可维护性,我们应该将每首诗歌的行数定义为一个常量。
private static final int POEM_LINES_LENGTH = 5; // 每首诗歌的固定行数
使用 Files.readAllLines() 方法将整个文件的内容一次性读取到一个 List<String> 中。
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<String> allLines = Files.readAllLines(Paths.get(file.getAbsolutePath()));在读取所有行之后,我们需要确定文件中有多少首完整的诗歌,然后从中随机选择一首。
int totalPoems = allLines.size() / POEM_LINES_LENGTH; // 计算完整的诗歌数量
if (totalPoems == 0) {
System.out.println("文件中没有足够的行来构成一首完整的诗歌。");
return;
}
int randomPoemIndex = new Random().nextInt(totalPoems); // 随机选择一首诗歌的索引 (0到totalPoems-1)根据随机选择的诗歌索引和每首诗歌的固定行数,计算出该诗歌在 allLines 列表中的起始和结束索引。
int startIndex = randomPoemIndex * POEM_LINES_LENGTH; // 随机诗歌的起始行索引 int endIndex = startIndex + POEM_LINES_LENGTH; // 随机诗歌的结束行索引 (不包含)
最后,使用 List.subList() 方法提取指定范围的行,并遍历打印。
List<String> 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<String> 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<String> 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();
}
}
}通过本教程,我们学习了如何利用Java NIO.2的 Files.readAllLines() 方法高效读取文本文件,结合 java.util.Random 生成随机索引,并使用 List.subList() 准确提取指定行数的文本块。这种方法简洁、高效,并且易于理解和维护,适用于从结构化文本文件中随机抽取固定大小数据块的多种场景。在实际应用中,务必考虑文件路径、异常处理和潜在的内存消耗问题,以确保程序的健壮性和性能。
以上就是Java从文本文件随机读取并打印指定行数内容的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号