From 0ebfb8146d0258d9b030d498fd10f0b947f3ab30 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 11 Apr 2023 22:44:06 +0800 Subject: [PATCH] =?UTF-8?q?CsvReader=E4=BF=AE=E6=94=B9=E7=AD=96=E7=95=A5?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=8F=AF=E9=80=89=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=85=B3=E9=97=ADReader=E9=87=8D=E8=BD=BD=EF=BC=8C=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=8D=E5=85=B3=E9=97=ADReader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +- .../hutool/core/text/csv/CsvBaseReader.java | 39 ++++++++++++++++--- .../cn/hutool/core/text/csv/CsvReader.java | 4 +- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d952d3518..f83d98d12 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.17.M1 (2023-04-05) +# 5.8.17.M1 (2023-04-11) ### 🐣新特性 * 【core 】 SerializeUtil.deserialize增加白名单类,避免RCE vulnerability(issue#3021@Github) @@ -13,6 +13,7 @@ * 【core 】 NamingCase.toCamelCase新增重载,可选是否转换其他字符为小写(issue#3031@ithub) * 【core 】 新增JdkUtil * 【core 】 DateUtil.getZodiac增加越界检查(issue#3036@Github) +* 【core 】 CsvReader修改策略,添加可选是否关闭Reader重载,默认不关闭Reader(issue#I6UAX1@Gitee) ### 🐞Bug修复 * 【core 】 CollUtil.split优化切割列表参数判断,避免OOM(pr#3026@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java index 2ac2f9186..8594d92fa 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java @@ -126,7 +126,7 @@ public class CsvBaseReader implements Serializable { * @param rowHandler 行处理器,用于一行一行的处理数据 */ public void readFromStr(String csvStr, CsvRowHandler rowHandler) { - read(parse(new StringReader(csvStr)), rowHandler); + read(parse(new StringReader(csvStr)), true, rowHandler); } @@ -174,9 +174,21 @@ public class CsvBaseReader implements Serializable { * @throws IORuntimeException IO异常 */ public CsvData read(Reader reader) throws IORuntimeException { + return read(reader, true); + } + + /** + * 从Reader中读取CSV数据 + * + * @param reader Reader + * @param close 读取结束是否关闭Reader + * @return {@link CsvData},包含数据列表和行信息 + * @throws IORuntimeException IO异常 + */ + public CsvData read(Reader reader, boolean close) throws IORuntimeException { final CsvParser csvParser = parse(reader); final List rows = new ArrayList<>(); - read(csvParser, rows::add); + read(csvParser, close, rows::add); final List header = config.headerLineNo > -1 ? csvParser.getHeader() : null; return new CsvData(header, rows); @@ -243,7 +255,19 @@ public class CsvBaseReader implements Serializable { * @throws IORuntimeException IO异常 */ public void read(Reader reader, CsvRowHandler rowHandler) throws IORuntimeException { - read(parse(reader), rowHandler); + read(reader, true, rowHandler); + } + + /** + * 从Reader中读取CSV数据,读取后关闭Reader + * + * @param reader Reader + * @param close 读取结束是否关闭Reader + * @param rowHandler 行处理器,用于一行一行的处理数据 + * @throws IORuntimeException IO异常 + */ + public void read(Reader reader, boolean close, CsvRowHandler rowHandler) throws IORuntimeException { + read(parse(reader), close, rowHandler); } //--------------------------------------------------------------------------------------------- Private method start @@ -252,17 +276,20 @@ public class CsvBaseReader implements Serializable { * 读取CSV数据,读取后关闭Parser * * @param csvParser CSV解析器 + * @param close 读取结束是否关闭{@link CsvParser} * @param rowHandler 行处理器,用于一行一行的处理数据 * @throws IORuntimeException IO异常 * @since 5.0.4 */ - private void read(CsvParser csvParser, CsvRowHandler rowHandler) throws IORuntimeException { + private void read(CsvParser csvParser, boolean close, CsvRowHandler rowHandler) throws IORuntimeException { try { - while (csvParser.hasNext()){ + while (csvParser.hasNext()) { rowHandler.handle(csvParser.next()); } } finally { - IoUtil.close(csvParser); + if(close){ + IoUtil.close(csvParser); + } } } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReader.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReader.java index 15065cb8f..286770fb9 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReader.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReader.java @@ -109,7 +109,7 @@ public class CsvReader extends CsvBaseReader implements Iterable, Closea * @throws IORuntimeException IO异常 */ public CsvData read() throws IORuntimeException { - return read(this.reader); + return read(this.reader, false); } /** @@ -121,7 +121,7 @@ public class CsvReader extends CsvBaseReader implements Iterable, Closea * @since 5.0.4 */ public void read(CsvRowHandler rowHandler) throws IORuntimeException { - read(this.reader, rowHandler); + read(this.reader, false, rowHandler); } /**