资源创作小能手头像
57 读文件不用再写try-catch,这个Java工具类6个方法默认UTF-8封面图

57 读文件不用再写try-catch,这个Java工具类6个方法默认UTF-8

📌 高并发系统设计: 基于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

四、工具类源码(可直接复制)

📦 57-文本文件读取工具类


觉得对您有帮助,麻烦点点关注啦,您的关注是我创作的最大动力~ 🎯

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/horizon90/article/details/168835023

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--