bufferedreader 默认仅支持 、 、 行结束符,如需自定义(如 "--end--"),须自行实现 readline 逻辑:逐字符/批量读取、stringbuilder 累积、末尾匹配终止符;scanner 可用 usedelimiter 设置正则分隔符,但灵活性与可靠性较低;推荐封装 linereader 工具类统一处理缓冲、查找与边界情况。

Java 标准库的 BufferedReader 默认只识别
、
和
作为行结束符,不支持直接传入自定义分隔符。若需按其他字符串(如 "--END--"、"u2028" 或网络协议中的特定标记)切分行,必须绕过 readLine(),自行实现基于字符流的行解析逻辑。
用 BufferedReader + 自定义 readLine 实现
保持底层字符流封装优势(缓冲、高效),但替换行读取逻辑:
- 调用
reader.read()逐字符读取,或用reader.read(char[], int, int)批量读取到缓冲区 - 在内存中维护一个
StringBuilder累积当前行内容 - 每次读入新字符后,检查末尾是否匹配目标行结束符(注意跨缓冲区边界的情况,简单场景可暂不处理;高可靠需求建议用滑动窗口或状态机)
- 匹配成功则返回已累积内容,并清空
StringBuilder;未匹配则继续追加
用 Scanner 并设置 delimiter(适合简单场景)
Scanner 支持正则表达式分隔符,可灵活指定行结束模式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 构造时传入字符流:
new Scanner(reader) - 调用
useDelimiter(Pattern.compile("your_pattern")),例如useDelimiter(Pattern.compile("--END--|\R"))(\R匹配任意 Unicode 行终止符) - 用
hasNext()和next()获取每“行”,注意next()返回的是分隔符前的内容,且会跳过分隔符 - 缺点:
Scanner内部也做缓冲,但异常处理和编码控制不如BufferedReader直观;不适用于需要保留分隔符或严格流顺序的场景
封装为可复用的 LineReader 工具类
将逻辑收拢,提升可读性和复用性:
- 构造函数接收
Reader和String lineTerminator - 内部使用
char[] buf = new char[8192]缓冲,配合int pos和int limit管理读取位置 - 关键方法
String readLine() throws IOException:循环填充缓冲区 → 在buf[pos..limit)中查找终止符 → 截取子串 → 更新pos跳过分隔符 - 对多字符终止符(如
" "),需避免误判单个或;推荐用String.indexOf配合偏移搜索,或预编译成Pattern处理复杂情况
注意事项与边界处理
实际使用中容易忽略的关键点:
- 流末尾无结束符时,最后一段内容仍需返回(即
EOF触发时,若StringBuilder非空,应返回其内容) - 终止符本身不包含在返回结果中;若需保留,改用
findWithinHorizon或手动截取逻辑 - 多线程不安全:所有方案默认非线程安全,如需并发读取,应加锁或为每个线程创建独立实例
- 编码一致性:确保
Reader创建时指定了正确字符集(如new InputStreamReader(in, "UTF-8")),否则自定义终止符可能因字节误解而无法匹配
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










