From 566fffdce1cfcd8ab4bb461e4e120e67fb71a9b8 Mon Sep 17 00:00:00 2001 From: duandazhi Date: Wed, 30 Jun 2021 22:31:09 +0800 Subject: [PATCH 1/3] =?UTF-8?q?1=E3=80=81CsvWriter=20=E5=A2=9E=E5=8A=A0=20?= =?UTF-8?q?writer.write(csvData)=E7=9A=84=E6=96=B9=E6=B3=95=E9=87=8D?= =?UTF-8?q?=E8=BD=BD=EF=BC=9B=202=E3=80=81=E6=B5=8B=E8=AF=95=E7=B1=BB?= =?UTF-8?q?=E5=86=99=E6=96=87=E4=BB=B6=20=E5=AF=B9macos=E3=80=81linux=20?= =?UTF-8?q?=E7=94=B5=E8=84=91=E7=9A=84=E6=94=AF=E6=8C=81=203=E3=80=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B5=8B=E8=AF=95=E7=B1=BB=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/text/csv/CsvData.java | 2 +- .../java/cn/hutool/core/text/csv/CsvUtil.java | 2 +- .../cn/hutool/core/text/csv/CsvWriter.java | 19 ++++++ .../cn/hutool/core/text/csv/CsvUtilTest.java | 61 ++++++++++++++++--- .../cn/hutool/core/util/JAXBUtilTest.java | 2 +- .../java/cn/hutool/core/util/XmlUtilTest.java | 29 +++++---- 6 files changed, 90 insertions(+), 25 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java index 3bdde7d8d..a02290e97 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java @@ -19,7 +19,7 @@ public class CsvData implements Iterable, Serializable { /** * 构造 * - * @param header 头信息 + * @param header 头信息, 可以为null * @param rows 行 */ public CsvData(final List header, final List rows) { diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvUtil.java index d4df1de95..8b10ca02f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvUtil.java @@ -17,7 +17,7 @@ public class CsvUtil { /** * 获取CSV读取器 * - * @param config 配置 + * @param config 配置, 允许为空. * @return {@link CsvReader} */ public static CsvReader getReader(CsvReadConfig config) { diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriter.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriter.java index cc2f1778a..2c7b01098 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriter.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriter.java @@ -207,6 +207,25 @@ public final class CsvWriter implements Closeable, Flushable, Serializable { return this; } + /** + * 将一个 CsvData 集合写出到Writer + * + * @param csvData CsvData + * @return this + */ + public CsvWriter write(CsvData csvData) { + if (csvData != null) { + // 1、写header + if (CollUtil.isNotEmpty(csvData.getHeader())) { + this.writeLine(csvData.getHeader().toArray(new String[0])); + } + // 2、写内容 + this.write(csvData.getRows()); + flush(); + } + return this; + } + /** * 将一个Bean集合写出到Writer,并自动生成表头 * diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java index 6f58817c3..4c12ec193 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java @@ -1,15 +1,18 @@ package cn.hutool.core.text.csv; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Console; import cn.hutool.core.util.CharsetUtil; +import lombok.AllArgsConstructor; import lombok.Data; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; -import java.util.ArrayList; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; public class CsvUtilTest { @@ -48,13 +51,15 @@ public class CsvUtilTest { @Ignore public void readTest3() { CsvReader reader = CsvUtil.getReader(); - reader.read(FileUtil.getUtf8Reader("d:/test/test.csv"), Console::log); + String path = FileUtil.isWindows() ? "d:/test/test.csv" : "~/test/test.csv"; + reader.read(FileUtil.getUtf8Reader(path), Console::log); } @Test @Ignore public void writeTest() { - CsvWriter writer = CsvUtil.getWriter("d:/test/testWrite.csv", CharsetUtil.CHARSET_UTF_8); + String path = FileUtil.isWindows() ? "d:/test/testWrite.csv" : "~/test/testWrite.csv"; + CsvWriter writer = CsvUtil.getWriter(path, CharsetUtil.CHARSET_UTF_8); writer.write( new String[] {"a1", "b1", "c1", "123345346456745756756785656"}, new String[] {"a2", "b2", "c2"}, @@ -73,7 +78,8 @@ public class CsvUtilTest { Integer age; } - CsvWriter writer = CsvUtil.getWriter("d:/test/testWriteBeans.csv", CharsetUtil.CHARSET_UTF_8); + String path = FileUtil.isWindows() ? "d:/test/testWriteBeans.csv" : "~/test/testWriteBeans.csv"; + CsvWriter writer = CsvUtil.getWriter(path, CharsetUtil.CHARSET_UTF_8); List students = new ArrayList<>(); Student student1 = new Student(); student1.setId(1); @@ -101,7 +107,8 @@ public class CsvUtilTest { @Ignore public void readLfTest(){ final CsvReader reader = CsvUtil.getReader(); - final CsvData read = reader.read(FileUtil.file("d:/test/rw_test.csv")); + String path = FileUtil.isWindows() ? "d:/test/rw_test.csv" : "~/test/rw_test.csv"; + final CsvData read = reader.read(FileUtil.file(path)); for (CsvRow row : read) { Console.log(row); } @@ -121,7 +128,47 @@ public class CsvUtilTest { list.add(1); resultList.add(list); - final CsvWriter writer = CsvUtil.getWriter("d:/test/csvWrapTest.csv", CharsetUtil.CHARSET_UTF_8); + String path = FileUtil.isWindows() ? "d:/test/csvWrapTest.csv" : "~/test/csvWrapTest.csv"; + final CsvWriter writer = CsvUtil.getWriter(path, CharsetUtil.CHARSET_UTF_8); writer.write(resultList); } + + @Test + @Ignore + public void writeDataTest(){ + @Data + @AllArgsConstructor + class User { + Integer userId; + String username; + String mobile; + } + + List header = ListUtil.of("用户id", "用户名", "手机号"); + List row = new ArrayList<>(); + + List datas = new ArrayList<>(); + datas.add(new User(1, "张三", "18800001111")); + datas.add(new User(2, "李四", "18800001112")); + datas.add(new User(3, "王五", "18800001113")); + datas.add(new User(4, "赵六", "18800001114")); + + //可以为null + //Map headMap = null; + Map headMap = new HashMap<>(); + headMap.put("userId", 0); + headMap.put("username", 1); + headMap.put("mobile", 2); + + for (int i = 0; i < datas.size(); i++) { + User user = datas.get(i); + // row.size() + 1, 表示从第2行开始,第一行是标题栏 + row.add(new CsvRow(row.size() + 1, headMap, ListUtil.toList(BeanUtil.beanToMap(user).values()).stream().map(Object::toString).collect(Collectors.toList()))); + } + + CsvData csvData = new CsvData(header, row); + String path = FileUtil.isWindows() ? "d:/test/csvWriteDataTest.csv" : "~/test/csvWriteDataTest.csv"; + final CsvWriter writer = CsvUtil.getWriter(path, CharsetUtil.CHARSET_UTF_8); + writer.write(csvData); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/JAXBUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/JAXBUtilTest.java index 8d9ce8989..3dd003084 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/JAXBUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/JAXBUtilTest.java @@ -13,7 +13,7 @@ import javax.xml.bind.annotation.*; */ public class JAXBUtilTest { - private String xmlStr = "\n" + + private final String xmlStr = "\n" + "\n" + " 西安市第一中学\n" + " 西安市雁塔区长安堡一号\n" + diff --git a/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java index 59558f783..30015eec3 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java @@ -197,6 +197,15 @@ public class XmlUtilTest { @Test public void xmlToBeanTest() { + @Data + class TestBean { + private String ReqCode; + private String AccountName; + private String Operator; + private String ProjectCode; + private String BankCode; + } + final TestBean testBean = new TestBean(); testBean.setReqCode("1111"); testBean.setAccountName("账户名称"); @@ -217,6 +226,11 @@ public class XmlUtilTest { @Test public void xmlToBeanTest2(){ + @Data + class SmsRes { + private String code; + } + //issue#1663@Github String xmlStr = "02"; @@ -233,11 +247,6 @@ public class XmlUtilTest { Assert.assertEquals(res.toString(), res1.toString()); } - @Data - static class SmsRes { - private String code; - } - @Test public void cleanCommentTest() { final String xmlContent = "hutooljava"; @@ -245,16 +254,6 @@ public class XmlUtilTest { Assert.assertEquals("hutooljava", ret); } - @Data - public static class TestBean { - private String ReqCode; - private String AccountName; - private String Operator; - private String ProjectCode; - private String BankCode; - } - - @Test @Ignore public void formatTest(){ From fcf9843c3b309eb72d05bbec6ec9ab822a57154a Mon Sep 17 00:00:00 2001 From: duandazhi Date: Thu, 1 Jul 2021 09:48:09 +0800 Subject: [PATCH 2/3] =?UTF-8?q?1=E3=80=81sm4=20=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-crypto/src/main/java/cn/hutool/crypto/SmUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/SmUtil.java b/hutool-crypto/src/main/java/cn/hutool/crypto/SmUtil.java index 2bc3a2236..7e9f5219c 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/SmUtil.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/SmUtil.java @@ -190,7 +190,7 @@ public class SmUtil { * @param key 密钥 * @return {@link SymmetricCrypto} */ - public static SymmetricCrypto sm4(byte[] key) { + public static SM4 sm4(byte[] key) { return new SM4(key); } From 1c299f9810d3bef8dc2679eeec9bbbdcb1372cc3 Mon Sep 17 00:00:00 2001 From: duandazhi Date: Thu, 1 Jul 2021 12:58:00 +0800 Subject: [PATCH 3/3] JAXBUtil beanToxml add comment --- .../src/main/java/cn/hutool/core/util/JAXBUtil.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/JAXBUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/JAXBUtil.java index 76f28abeb..fe2d06eb9 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/JAXBUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/JAXBUtil.java @@ -7,6 +7,10 @@ import cn.hutool.core.io.IoUtil; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; import java.io.File; import java.io.Reader; import java.io.StringWriter; @@ -30,6 +34,12 @@ public class JAXBUtil { /** * JavaBean转换成xml * + * bean上面用的常用注解 + * @see XmlRootElement @XmlRootElement(name = "school") + * @see XmlElement @XmlElement(name = "school_name", required = true) + * @see XmlElementWrapper @XmlElementWrapper(name="schools") + * @see XmlTransient JAXB "有两个名为 "**" 的属性,类的两个属性具有相同名称 "**""解决方案 + * * @param bean Bean对象 * @return 输出的XML字符串 */