📌 高并发系统设计: 基于Redis与MQ的秒杀系统架构:库存预减、防超卖与限流防刷全流程解析
📋 目录
一、工具类功能
把 Files.readString 与 readAllLines 收成一个入口,整个文件读成字符串或按行读成 List,默认 UTF-8 也可指定字符集,读前先确认路径存在且是普通文件。
二、所需环境
JDK 17或以上
三、方法与调用示例(按需调用)
🔢 方法序号:1
🎯 方法用途:
- 按 UTF-8 把整个文本文件读成一个字符串,路径写成字符串就行
- 读配置片段、模板文本这类小文件用它,比
Files.readString多一道路径校验
🧩 方法定义:public static String readString(String filePath) throws IOException
🗣️ 入参解释:public static String readString(字符串文件路径) throws IOException
📤 返回值解释:String,文件的完整内容,换行原样保留
💡 边界口径:
- 路径会先裁掉首尾空白再解析,前后多敲的空格不影响读取
- 读之前先确认文件存在且是普通文件,不满足抛
IllegalArgumentException,不会等 JDK 报出含义模糊的异常 - 编码与字节对不上时抛 JDK 的
MalformedInputException,不静默换成替换字符 - 内容全部载入内存,大文件请改用
Files.lines(path)流式处理
🧪 方法示例:
readString("文本文件读取示例/对账.csv")读到 51 个字符,[CRLF]换行原样在串里- 路径前后带空格再
readString(...),照样读到同一个文件 readString(" ")抛IllegalArgumentException: filePath 不能为null或空白
🔢 方法序号:2
🎯 方法用途:
Path入口,按默认 UTF-8 整个读成字符串- 手上已经是
Path(Paths.get、Files遍历出来的)时用它,省一次字符串转换
🧩 方法定义:public static String readString(Path path) throws IOException
🗣️ 入参解释:public static String readString(Path 文件路径) throws IOException
📤 返回值解释:String,文件的完整内容
💡 边界口径:
- 等价于
readString(path, StandardCharsets.UTF_8) - 路径为
null抛IllegalArgumentException: path 不能为null,与字符串入口同一口径 - 不剥 BOM:带 UTF-8 BOM 的文件读进来第一个字符就是
U+FEFF,会跟着进后续逻辑 - 文件存在但读不了(权限或被占用)抛
IllegalStateException
🧪 方法示例:
readString(csvPath)读到51个字符,文件本身是61字节- 读带 BOM 的文件,首字符拿到
U+FEFF,长度是6,比正文多一个字符 readString((Path) null)抛IllegalArgumentException: path 不能为null- 目标是目录时抛
IllegalArgumentException,消息是「目标不是普通文件」加上那个路径
🔢 方法序号:3
🎯 方法用途:
- 按你声明的字符集整个读文件,GBK 之类的老编码也能读对
- 来源方说了编码就显式传进来,比先猜再读更稳
🧩 方法定义:public static String readString(Path path, Charset charset) throws IOException
🗣️ 入参解释:public static String readString(Path 文件路径, 字符集) throws IOException
📤 返回值解释:String,按指定字符集解码后的内容
💡 边界口径:
charset传null退回 UTF-8,不会因为一个空引用整条链路报错- 字节与声明编码对不上时抛
MalformedInputException,比new String(bytes, charset)悄悄塞一串U+FFFD更适合做清洗入口 - 空文件读出
0字符,不是null
🧪 方法示例:
readString(gbkPath, Charset.forName("GBK"))读到两行中文,[第一行中文, 第二行中文]readString(csvPath, null)退回 UTF-8,读到51个字符- 空文件走这个入口读到
0字符 - GBK 字节用默认 UTF-8 硬读抛
MalformedInputException,不换成一串替换字符
🔢 方法序号:4
🎯 方法用途:
- 按 UTF-8 逐行读取文件,拿到一个行列表
- 对账小文件、配置清单这种「按行处理」的场合,读进来就能直接遍历
🧩 方法定义:public static List<String> readLines(Path path) throws IOException
🗣️ 入参解释:public static List<String> readLines(Path 文件路径) throws IOException
📤 返回值解释:List<String>,行列表,是不可变列表
💡 边界口径:
- 行切分以 JDK 的
readAllLines为准:LF、CRLF、裸 CR 三种换行等价 - 末尾换行不会多出一个空行,中间的空行原样保留
- 返回的列表不可变,
add会抛UnsupportedOperationException,要改先自己拷一份 - 空文件返回空列表而不是
null
🧪 方法示例:
readLines(csvPath)把 CRLF 按行切开,拿到[订单号,金额, SO20261005001,128.50, SO20261005002,66.00]3 行- 末尾带换行的文件读出来仍是
3行,没有多出的空行 readLines(emptyPath)拿到[]- 对返回的列表调
add(...)抛UnsupportedOperationException
🔢 方法序号:5
🎯 方法用途:
- 逐行读取的字符串路径入口
- 路径来自配置项或入参字符串时用它,不用先
Path.of一次
🧩 方法定义:public static List<String> readLines(String filePath) throws IOException
🗣️ 入参解释:public static List<String> readLines(字符串文件路径) throws IOException
📤 返回值解释:List<String>,行列表,不可变
💡 边界口径:
- 路径先裁首尾空白,配置里多打空格也能读到
- 文件不存在抛
IllegalArgumentException,消息是「文件不存在」加上那个路径 - 行切分与不可变口径同方法4
🧪 方法示例:
readLines("文本文件读取示例/对账.csv")拿到3行readLines("文本文件读取示例/没这个文件.txt")抛IllegalArgumentException,消息里带上「文件不存在」与实际路径
🔢 方法序号:6
🎯 方法用途:
- 按声明的字符集逐行读文件
- 老系统导出的 GBK 清单要按行处理时用它,不用整读进来再自己切行
🧩 方法定义:public static List<String> readLines(Path path, Charset charset) throws IOException
🗣️ 入参解释:public static List<String> readLines(Path 文件路径, 字符集) throws IOException
📤 返回值解释:List<String>,行列表,不可变
💡 边界口径:
charset传null退回 UTF-8- 编码不匹配抛
MalformedInputException,不静默替换 - 空文件返回空列表,行切分与不可变口径同方法4
🧪 方法示例:
readLines(gbkPath, Charset.forName("GBK"))拿到[第一行中文, 第二行中文]- 同一份 UTF-8 文件用
readLines(path, null)读到3行,退回了 UTF-8
四、工具类源码(可直接复制)
觉得对您有帮助,麻烦点点关注啦,您的关注是我创作的最大动力~ 🎯
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/horizon90/article/details/168835023




