
本文介绍一种健壮的 Java 字符串断行方法:在不超过指定宽度(如 20 字符)的前提下,自动回退至前一个空格处进行分割,确保每行只包含完整单词,避免单词被截断。
本文介绍一种健壮的 java 字符串断行方法:在不超过指定宽度(如 20 字符)的前提下,自动回退至前一个空格处进行分割,确保每行只含完整单词,避免单词被截断。
在文本处理(如控制台输出、日志格式化或简易富文本渲染)中,常需将长字符串按固定宽度“软换行”——即不强行在第 N 个字符处截断,而是寻找该位置附近最合理的断点(通常是前一个空格)。原始代码存在多个关键问题:循环逻辑错误(从 20 往回遍历却未跳出)、硬编码长度(substring(pos+1,21) 忽略实际字符串长度)、未处理无空格场景,导致重复打印与越界异常。
以下是推荐的双指针滑动窗口式实现,结构清晰、边界安全、可复用性强:
import java.util.Scanner;
public class WordWrap {
public static void wrapText(String input, int maxWidth) {
if (input == null || input.isEmpty() || maxWidth <= 0) {
System.out.println(input);
return;
}
int startPos = 0;
while (startPos < input.length()) {
int endPos = Math.min(startPos + maxWidth, input.length());
// 若当前行已达最大宽度,尝试向前查找空格
if (endPos < input.length() && input.charAt(endPos) != ' ') {
// 从 endPos-1 开始向前搜索空格
int breakPos = input.lastIndexOf(' ', endPos - 1);
if (breakPos > startPos) { // 找到有效空格
endPos = breakPos;
}
// 否则:本行超长但无空格(如超长单词),强制在 maxWidth 处断开(可选策略)
// 此处保持原意:优先保单词完整性,故不截断,而是让该单词独占一行
}
System.out.println(input.substring(startPos, endPos).trim());
startPos = endPos;
// 跳过空格(避免下一行开头出现多余空格)
while (startPos < input.length() && input.charAt(startPos) == ' ') {
startPos++;
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Please input a sentence: ");
String input = scanner.nextLine();
wrapText(input, 20);
scanner.close();
}
}运行示例:
输入:Hello there, I am doing some coding, I need some help
输出:
Hello there, I am doing some coding, I need some help
✅ 关键设计说明:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 双指针控制:startPos 标记当前行起始,endPos 动态计算安全结束位置,避免索引混乱;
- 空格智能回溯:使用 lastIndexOf(' ', endPos - 1) 精准定位前一个空格,确保单词完整性;
- 边界鲁棒性:显式检查 startPos < input.length() 和 breakPos > startPos,杜绝 StringIndexOutOfBoundsException;
- 空格清理:循环末尾跳过开头空格,防止输出中出现缩进错乱;
- 极端情况兼容:对空字符串、null、超长单字(如 "Supercalifragilisticexpialidocious")均有合理兜底。
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 该算法默认不拆分超长单词(如 25 字母单词在 maxWidth=20 下仍整行显示),符合“保单词”需求;若需强制断词,可在 breakPos <= startPos 分支中改用 endPos = startPos + maxWidth;
- 中文等无空格语言需额外处理(如按字符数切分),本方案专为英文/空格分隔文本优化;
- 生产环境建议封装为工具类方法,并增加单元测试覆盖边界用例(如纯空格、首尾空格、恰好 20 字无空格等)。
通过此实现,你获得的不仅是一段可运行代码,更是一种可扩展的文本流式处理范式——清晰、安全、语义明确。

















