Java 一行一行的读取文本,小Demo 大学问

news/2025/9/30 15:39:39/文章来源:https://www.cnblogs.com/vipsoft/p/19121262
String str="A\n" +"B\n" +"C";

在Java中,有多种方式可以一行一行地读取文本。以下是几种常用的方法:

1. 使用 BufferedReader + FileReader

String str = "A\n" + "B\n" + "C";// 方法1:从字符串读取
try (BufferedReader reader = new BufferedReader(new StringReader(str))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}// 方法2:从文件读取
try (BufferedReader reader = new BufferedReader(new FileReader("filename.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}

2. 使用 Scanner

String str = "A\n" + "B\n" + "C";// 从字符串读取
try (Scanner scanner = new Scanner(str)) {while (scanner.hasNextLine()) {String line = scanner.nextLine();System.out.println(line);}
}// 从文件读取
try (Scanner scanner = new Scanner(new File("filename.txt"))) {while (scanner.hasNextLine()) {String line = scanner.nextLine();System.out.println(line);}
} catch (FileNotFoundException e) {e.printStackTrace();
}

3. 使用 Files.lines() (Java 8+)

String str = "A\n" + "B\n" + "C";// 从字符串读取(需要先写入临时文件)
try {Path tempFile = Files.createTempFile("temp", ".txt");Files.write(tempFile, str.getBytes());Files.lines(tempFile).forEach(System.out::println);// 清理临时文件Files.deleteIfExists(tempFile);
} catch (IOException e) {e.printStackTrace();
}// 从文件读取
try {Files.lines(Paths.get("filename.txt")).forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}

4. 使用 String 的 split() 方法(适用于字符串)

String str = "A\n" + "B\n" + "C";String[] lines = str.split("\n");
for (String line : lines) {System.out.println(line);
}

5. 使用 Lines() 方法 (Java 11+)

String str = "A\n" + "B\n" + "C";// 从字符串读取
str.lines().forEach(System.out::println);

推荐方案

  • 对于字符串:使用 str.lines() (Java 11+) 或 split("\n")
  • 对于文件:使用 Files.lines() (Java 8+) 或 BufferedReader
  • 需要更多控制:使用 Scanner

最简洁的方式是使用 Java 11 的 lines() 方法:

String str = "A\n" + "B\n" + "C";
str.lines().forEach(System.out::println);

输出结果:

A
B
C

在 Java 8 环境下,split("\n")BufferedReader 各有优缺点,具体选择取决于使用场景:

性能对比

1. split("\n") - 适用于小文本

String str = "A\n" + "B\n" + "C";
String[] lines = str.split("\n");
for (String line : lines) {System.out.println(line);
}

优点:

  • 代码简洁,一行搞定
  • 适合已知内容较小的字符串
  • 可以直接得到数组,方便后续处理

缺点:

  • 一次性加载所有内容到内存,大文本会占用大量内存
  • 需要处理尾部的空行问题

2. BufferedReader - 适用于大文本或文件

String str = "A\n" + "B\n" + "C";
try (BufferedReader reader = new BufferedReader(new StringReader(str))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}

优点:

  • 内存效率高,逐行读取,适合大文件
  • 自动处理不同操作系统的换行符(\n, \r\n, \r
  • 统一的接口处理字符串和文件

缺点:

  • 代码相对冗长
  • 需要处理异常

推荐选择

场景 1:小文本,内容已知且不大

// 使用 split("\n")
String[] lines = str.split("\n");
Arrays.stream(lines).forEach(System.out::println);

场景 2:大文本或需要处理文件

// 使用 BufferedReader
try (BufferedReader reader = new BufferedReader(new StringReader(str))) {reader.lines().forEach(System.out::println); // Java 8 Stream API
} catch (IOException e) {e.printStackTrace();
}

场景 3:Java 8 更优雅的写法

// 结合 BufferedReader 和 Stream API
try (BufferedReader reader = new BufferedReader(new StringReader(str))) {List<String> lines = reader.lines().collect(Collectors.toList());lines.forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}

实际建议

对于你的具体案例:

String str = "A\n" + "B\n" + "C";// 如果确定文本很小,用 split 更简洁
String[] lines = str.split("\n");
for (String line : lines) {System.out.println(line);
}// 如果要养成好习惯或处理可能的大文本,用 BufferedReader
try (BufferedReader reader = new BufferedReader(new StringReader(str))) {reader.lines().forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}

总结: 对于你当前的小例子,split("\n") 完全足够且更简洁。但如果考虑到代码的可扩展性和健壮性,BufferedReader 是更好的选择。

Scanner 相比 BufferedReader 提供了更丰富的文本解析功能,主要在数据类型解析和分隔符控制方面有优势。

Scanner 的额外控制能力

1. 数据类型自动解析

String data = "John 25 78.5 true\nAlice 30 65.2 false";try (Scanner scanner = new Scanner(data)) {while (scanner.hasNext()) {if (scanner.hasNextInt()) {int age = scanner.nextInt();System.out.println("年龄: " + age);} else if (scanner.hasNextDouble()) {double weight = scanner.nextDouble();System.out.println("体重: " + weight);} else if (scanner.hasNextBoolean()) {boolean status = scanner.nextBoolean();System.out.println("状态: " + status);} else {String name = scanner.next();System.out.println("姓名: " + name);}}
}

2. 灵活的分隔符控制

String csvData = "A,B,C\n1,2,3\nX,Y,Z";// 使用逗号作为分隔符
try (Scanner scanner = new Scanner(csvData)) {scanner.useDelimiter(",|\n"); // 逗号或换行符作为分隔符while (scanner.hasNext()) {String token = scanner.next();System.out.println("Token: " + token);}
}

3. 模式匹配(正则表达式)

String text = "价格: $25.50, 重量: 1.5kg, 日期: 2023-01-01";try (Scanner scanner = new Scanner(text)) {// 查找价格模式String pricePattern = "\\$\\d+\\.\\d+";while (scanner.hasNext(pricePattern)) {String price = scanner.next(pricePattern);System.out.println("找到价格: " + price);}// 重置Scanner查找其他模式scanner = new Scanner(text);String datePattern = "\\d{4}-\\d{2}-\\d{2}";if (scanner.hasNext(datePattern)) {String date = scanner.next(datePattern);System.out.println("找到日期: " + date);}
}

4. 区域设置和数字格式

String europeanData = "1.234,56 2.345,67"; // 欧洲数字格式try (Scanner scanner = new Scanner(europeanData)) {scanner.useLocale(Locale.GERMANY); // 使用德国区域设置while (scanner.hasNextDouble()) {double number = scanner.nextDouble();System.out.println("数字: " + number);}
}

5. 精确的输入验证

String input = "123 456 abc 789";try (Scanner scanner = new Scanner(input)) {// 精确控制输入类型if (scanner.hasNextInt()) {int first = scanner.nextInt(); // 123}if (scanner.hasNextInt()) {int second = scanner.nextInt(); // 456}if (scanner.hasNext("abc")) {String text = scanner.next(); // abc}if (scanner.hasNextInt()) {int third = scanner.nextInt(); // 789}
}

与 BufferedReader 的对比

特性 Scanner BufferedReader
数据类型解析 ✅ 自动解析 int, double, boolean 等 ❌ 只能返回 String
分隔符控制 ✅ 高度可配置,支持正则表达式 ❌ 固定按行读取
模式匹配 ✅ 支持正则表达式模式匹配 ❌ 不支持
区域设置 ✅ 支持不同地区的数字格式 ❌ 不支持
性能 ❌ 相对较慢 ✅ 更快
内存使用 ❌ 缓冲区较小 ✅ 缓冲区可配置
简单行读取 ✅ 支持但较慢 ✅ 专门优化

使用场景建议

使用 Scanner 的场景:

// 解析结构化数据
String studentData = "张三 20 计算机 85.5";
try (Scanner scanner = new Scanner(studentData)) {String name = scanner.next();int age = scanner.nextInt();String major = scanner.next();double score = scanner.nextDouble();
}// 解析CSV数据
String csv = "1,苹果,5.5\n2,香蕉,3.2";
try (Scanner scanner = new Scanner(csv)) {scanner.useDelimiter(",|\n");while (scanner.hasNext()) {// 按字段解析}
}

使用 BufferedReader 的场景:

// 简单逐行读取大文件
try (BufferedReader reader = new BufferedReader(new FileReader("largefile.txt"))) {String line;while ((line = reader.readLine()) != null) {// 处理每一行}
}// 性能要求高的场景
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"), 8192)) {// 使用更大的缓冲区
}

总结

选择 Scanner 当需要:

  • 自动数据类型转换
  • 复杂的分隔符逻辑
  • 正则表达式模式匹配
  • 解析结构化文本数据

选择 BufferedReader 当需要:

  • 高性能的简单行读取
  • 处理大文件
  • 最小内存占用
  • 简单的文本处理

对于你的原始需求(一行一行读取文本),如果只是简单读取,BufferedReader 性能更好;如果需要解析每行的数据内容,Scanner 更合适。
RandomAccessFile、FileInputStream、MappedByteBuffer、FileChannel 区别、应用场景及示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费网站系统沧州讯呗网络科技有限公司

动态标签foreach&#xff0c;做过批量操作&#xff0c;但是foreach只能处理记录数不多的批量操作&#xff0c;数据量大了后&#xff0c;先不说效率&#xff0c;能不能成功操作都是问题&#xff0c;所以这里讲一讲Mybatis正确的批量操作方法&#xff1a; 在获取opensession对象…

数字化转型业务流程总览图

数字化转型业务流程总览图flowchart TDA[客户询价/委托] --> B[智能报价系统<br/>AI-Powered Quotation]B --> C{报价确认?}C -->|是| D[订单管理<br/>Order Management]C -->|否| E[报价调整…

MYSQL数据库取消表的约束

要修改MySQL中的chk_quantity约束以允许负数,可以通过以下步骤实现: 1. 删除原有约束 首先需要删除现有的chk_quantity约束: sqlCopy Code ALTER TABLE 表名 DROP CONSTRAINT chk_quantity; 2. 重新添加允许负数的…

家里wifi电信出口ip如何控制不变,解决访问云服务器上面的资源

家里wifi电信出口ip如何控制不变,解决访问云服务器上面的资源家里wifi电信出口ip如何控制不变,解决访问云服务器上面的资源 解决方案:通过在公司部署一台公共机器,通过远程的方式来连接,而公司的公共机器是可以将公…

2025 年京东 e 卡回收平台最新推荐排行榜:权威测评实时结算平台,助力用户安全高效转让京东 e 卡

随着数字消费的普及,京东 e 卡作为常用电商消费凭证,其闲置回收需求持续攀升。但当前回收市场乱象丛生,部分平台结算周期长达数天,严重影响用户资金周转;还有平台暗藏手续费,导致用户实际收益大幅缩水,更有非正…

【qml-12】Quick3D达成机器人鼠标拖拽转换视角(无限角度)与滚轮缩放

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年挤压造粒机源头厂家最新推荐榜单:前五企业技术实力、服务能力及口碑测评指南对辊挤压/化肥挤压/干粉挤压造粒机厂家推荐

随着有机肥产业朝着规模化、精细化方向快速发展,挤压造粒机作为生产核心设备,其质量与性能直接决定企业生产效率、产品品质及综合成本。但当前市场环境中,设备乱象频发:部分设备无法适配湿度 20%-40% 的发酵有机物…

三生团队网站找谁做的中山市建设工程网上办事系统

因为在OJ上做编程&#xff0c;要求标准输入&#xff0c;特别是多行输入。特意查了资料&#xff0c;自己验证了可行性。if __name__ "__main__":strList []for line in sys.stdin: #当没有接受到输入结束信号就一直遍历每一行tempStr line.split()#对字符串利用空…

2025 年支付宝消费券回收平台最新推荐榜单:优质平台权威测评,助您高效安全处理闲置消费券支付宝消费券回收/闲置支付宝消费券回收/支付宝消费券快速回收平台推荐

随着支付宝消费券在日常生活中的广泛应用,越来越多用户面临消费券闲置难题 —— 指定消费场景限制、有效期短等问题,让大量消费券白白浪费。而当前支付宝消费券回收行业乱象丛生,部分平台结算周期长达数天、安全防护…

ICP备案查询网站 域名备案查询

ICP备案查询网站 域名备案查询ICP备案查询网站 官方查询渠道‌工信部ICP/IP地址/域名信息备案管理系统‌网址:https://beian.miit.gov.cn/https://beian.miit.gov.cn/#/Integrated/index

模板网站哪个好近期十大热点新闻

L1正则化和L2正则化是机器学习中常用的两种正则化方法&#xff0c;用于防止模型过拟合。它们的区别主要体现在数学形式、作用机制和应用效果上。以下是详细对比&#xff1a; 1. 数学定义 L1正则化&#xff08;也叫Lasso正则化&#xff09;&#xff1a; 在损失函数中加入权重参…

网站提交百度了经常修改网站搬瓦工做网站

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 随着区块链技术和大数据技术的不断发展&#xff0c;两者的结合为企业带来了新的商业模式…

网络与系统攻防技术实验一——逆向破解与Bof

1.实验内容1.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。1.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。1.3注入一个自己制作的shellcode并运行这段shell…

对外宣传网站建设方案工商营业执照咨询电话24小时

文章目录 第一章 Range &#xff08;单元格&#xff09;对象1. 单元格的引用方法1.1 使用Range 属性1.2 使用Cells 属性1.3 使用快捷记号1.4 使用Offset 属性1.5 使用Resizae 属性1.6 使用Union 方法1.7 使用UsedRange 属性1.8 使用CurrentRegion 属性 2. 选定单元格区域的方法…

做外贸推广的网站建博客网站

记一下idea的svn使用有图超详细 根据在eclipse里使用svn的经验琢磨了一下idea,现把idea下svn的使用方法记录如下 主要分为几个功能来介绍 第一个功能当然是把远程的svn代码拉到我们本地 下面的多出了一个svn的窗口&#xff0c;在左边有加号可以添加一个svn的库 输入svn的地…

“计算机配置\Windows 设置\安全设置\本地策略\审核策略” 配置后不生效

Windows Sever 2016 “计算机配置\Windows 设置\安全设置\本地策略\审核策略” 配置后不生效,gpupdate /force也不生效,重启也不生效,重新打开会恢复未配置。 解决方法: 1、查看审核策略同一目录下面的安全选项”审…

呼和浩特网站建设SEO优化优秀网站网页设计图片

当你在执行一条SQL语句非常慢的时候,你是不是想问Oracle怎么执行这条语句的呢? Oracle提供的SQL_TRACE工具可以让你知道你执行的SQL究竟做了什么.执行的过程会被 输出到trace文件中. 下面用例子来跟踪一个SQL语句的执行情况: SQL> create table t as select rownum as id,o…

云南建设厅网站删除海阳网站开发

11 刷新一下pom 万一没有引入进去 jpa和mybatis选择哪个&#xff1f; 1.看领导要求 2.都会最好 多学点是没错的

Spring Boot 事件发布与监听 观察者模式的实际应用 - 实践

Spring Boot 事件发布与监听 观察者模式的实际应用 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

[ROI 2018] Quick sort

感觉正常 OI 学生很难在不依赖大脑随机性情况下想出这道题,因为我们没有学斯特林公式。 考虑观察操作的影响,并确定还原策略。这道题中我们可以考虑按 \(1\rightarrow n\) 的顺序还原,这样的好处是如果我们每次能保…