diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java index 0684f6082..7547671a3 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java @@ -6,8 +6,8 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.mutable.MutableEntry; import cn.hutool.core.map.CaseInsensitiveMap; import cn.hutool.core.map.MapWrapper; -import cn.hutool.core.text.StrUtil; import cn.hutool.core.reflect.TypeUtil; +import cn.hutool.core.text.StrUtil; import java.lang.reflect.Type; import java.util.Map; diff --git a/hutool-core/src/main/java/cn/hutool/core/io/BomReader.java b/hutool-core/src/main/java/cn/hutool/core/io/BomReader.java index e09498d47..736fdf905 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/BomReader.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/BomReader.java @@ -3,10 +3,8 @@ package cn.hutool.core.io; import cn.hutool.core.io.stream.BOMInputStream; import cn.hutool.core.lang.Assert; -import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.Reader; import java.io.UnsupportedEncodingException; /** @@ -29,9 +27,7 @@ import java.io.UnsupportedEncodingException; * @author looly * @since 5.7.14 */ -public class BomReader extends Reader { - - private InputStreamReader reader; +public class BomReader extends ReaderWrapper { /** * 构造 @@ -39,22 +35,22 @@ public class BomReader extends Reader { * @param in 流 */ public BomReader(final InputStream in) { + super(initReader(in)); + } + + /** + * 初始化为{@link InputStreamReader},将给定流转换为{@link BOMInputStream} + * + * @param in {@link InputStream} + * @return {@link InputStreamReader} + */ + private static InputStreamReader initReader(final InputStream in) { Assert.notNull(in, "InputStream must be not null!"); final BOMInputStream bin = (in instanceof BOMInputStream) ? (BOMInputStream) in : new BOMInputStream(in); try { - this.reader = new InputStreamReader(bin, bin.getCharset()); - } catch (final UnsupportedEncodingException ignore) { + return new InputStreamReader(bin, bin.getCharset()); + } catch (final UnsupportedEncodingException e) { + throw new IORuntimeException(e); } } - - @SuppressWarnings("NullableProblems") - @Override - public int read(final char[] buffer, final int off, final int len) throws IOException { - return reader.read(buffer, off, len); - } - - @Override - public void close() throws IOException { - reader.close(); - } } diff --git a/hutool-core/src/main/java/cn/hutool/core/io/LineReader.java b/hutool-core/src/main/java/cn/hutool/core/io/LineReader.java new file mode 100755 index 000000000..0e7c559ca --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/io/LineReader.java @@ -0,0 +1,54 @@ +package cn.hutool.core.io; + +import cn.hutool.core.util.ArrayUtil; + +import java.io.IOException; +import java.io.Reader; + +/** + * 行读取器,类似于BufferedInputStream,支持注释和多行转义 + * TODO 待实现 + * + * @author looly + */ +public class LineReader extends ReaderWrapper { + + /** + * 注释标识符 + */ + private char[] commentFlags; + + /** + * 构造 + * + * @param reader {@link Reader} + */ + public LineReader(final Reader reader) { + super(reader); + } + + /** + * 设置注释行标识符 + * + * @param commentFlags 注释行标识符 + * @return this + */ + public LineReader setCommentFlags(final char... commentFlags) { + if (ArrayUtil.isEmpty(commentFlags)) { + // 无注释行 + this.commentFlags = null; + } + this.commentFlags = ArrayUtil.copy(commentFlags, new char[commentFlags.length]); + return this; + } + + /** + * 读取一行 + * + * @return 内容 + * @throws IOException IO异常 + */ + public String readLine() throws IOException { + return null; + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/io/ReaderWrapper.java b/hutool-core/src/main/java/cn/hutool/core/io/ReaderWrapper.java new file mode 100755 index 000000000..f196d41b9 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/io/ReaderWrapper.java @@ -0,0 +1,60 @@ +package cn.hutool.core.io; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.func.Wrapper; + +import java.io.IOException; +import java.io.Reader; +import java.nio.CharBuffer; + +/** + * {@link Reader} 包装 + * + * @author looly + */ +public class ReaderWrapper extends Reader implements Wrapper { + + protected final Reader raw; + + /** + * 构造 + * + * @param reader {@link Reader} + */ + public ReaderWrapper(final Reader reader) { + this.raw = Assert.notNull(reader); + } + + @Override + public Reader getRaw() { + return this.raw; + } + + @Override + public int read() throws IOException { + return raw.read(); + } + + @SuppressWarnings("NullableProblems") + @Override + public int read(final CharBuffer target) throws IOException { + return raw.read(target); + } + + @SuppressWarnings("NullableProblems") + @Override + public int read(final char[] cbuf) throws IOException { + return raw.read(cbuf); + } + + @SuppressWarnings("NullableProblems") + @Override + public int read(final char[] buffer, final int off, final int len) throws IOException { + return raw.read(buffer, off, len); + } + + @Override + public void close() throws IOException { + raw.close(); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharPool.java b/hutool-core/src/main/java/cn/hutool/core/text/CharPool.java index 934af9605..5847223da 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharPool.java @@ -14,7 +14,7 @@ public interface CharPool { /** * 字符常量:制表符 {@code '\t'} */ - char TAB = ' '; + char TAB = '\t'; /** * 字符常量:点 {@code '.'} */ diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index 2e48d0097..0df22861f 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -515,8 +515,8 @@ public class ArrayUtil extends PrimitiveArrayUtil { * @param array 原数组 * @param newSize 新的数组大小 * @return 调整后的新数组 - * @since 4.6.7 * @see System#arraycopy(Object, int, Object, int, int) + * @since 4.6.7 */ public static Object resize(final Object array, final int newSize) { if (newSize < 0) { @@ -579,10 +579,39 @@ public class ArrayUtil extends PrimitiveArrayUtil { return result; } + /** + * 包装 {@link System#arraycopy(Object, int, Object, int, int)}
+ * 数组复制,缘数组和目标数组都是从位置0开始复制,复制长度为源数组的长度 + * + * @param 目标数组类型 + * @param src 源数组 + * @param dest 目标数组 + * @return 目标数组 + */ + public static T copy(final Object src, final T dest) { + return copy(src, dest, length(src)); + } + + /** + * 包装 {@link System#arraycopy(Object, int, Object, int, int)}
+ * 数组复制,缘数组和目标数组都是从位置0开始复制 + * + * @param 目标数组类型 + * @param src 源数组 + * @param dest 目标数组 + * @param length 拷贝数组长度 + * @return 目标数组 + * @since 3.0.6 + */ + public static T copy(final Object src, final T dest, final int length) { + return copy(src, 0, dest, 0, length); + } + /** * 包装 {@link System#arraycopy(Object, int, Object, int, int)}
* 数组复制 * + * @param 目标数组类型 * @param src 源数组 * @param srcPos 源数组开始位置 * @param dest 目标数组 @@ -591,28 +620,12 @@ public class ArrayUtil extends PrimitiveArrayUtil { * @return 目标数组 * @since 3.0.6 */ - public static Object copy(final Object src, final int srcPos, final Object dest, final int destPos, final int length) { + public static T copy(final Object src, final int srcPos, final T dest, final int destPos, final int length) { //noinspection SuspiciousSystemArraycopy System.arraycopy(src, srcPos, dest, destPos, length); return dest; } - /** - * 包装 {@link System#arraycopy(Object, int, Object, int, int)}
- * 数组复制,缘数组和目标数组都是从位置0开始复制 - * - * @param src 源数组 - * @param dest 目标数组 - * @param length 拷贝数组长度 - * @return 目标数组 - * @since 3.0.6 - */ - public static Object copy(final Object src, final Object dest, final int length) { - //noinspection SuspiciousSystemArraycopy - System.arraycopy(src, 0, dest, 0, length); - return dest; - } - /** * 克隆数组 * diff --git a/hutool-core/src/test/java/cn/hutool/core/io/LineReaderTest.java b/hutool-core/src/test/java/cn/hutool/core/io/LineReaderTest.java new file mode 100755 index 000000000..2300bcdaa --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/io/LineReaderTest.java @@ -0,0 +1,11 @@ +package cn.hutool.core.io; + +import org.junit.Test; + +import java.io.IOException; + +public class LineReaderTest { + @Test + public void readTest() throws IOException { + } +} diff --git a/hutool-core/src/test/resources/multi_line.properties b/hutool-core/src/test/resources/multi_line.properties new file mode 100755 index 000000000..17719feaa --- /dev/null +++ b/hutool-core/src/test/resources/multi_line.properties @@ -0,0 +1,27 @@ +client.mode=single +configure={\ + "singleServerConfig":{\ + "idleConnectionTimeout":10000,\ + "pingTimeout":1000, \ + "connectTimeout":10000, \ + "timeout":3000,\ + "retryAttempts":3,\ + "retryInterval":1500,\ + "reconnectionTimeout":3000,\ + "failedAttempts":3,\ + "password":null,\ + "subscriptionsPerConnection":5,\ + "clientName":null,\ + "address": "redis://127.0.0.1:6379",\ + "subscriptionConnectionMinimumIdleSize":1,\ + "subscriptionConnectionPoolSize":50,\ + "connectionMinimumIdleSize":12,\ + "connectionPoolSize":12\ + },\ + "threads":2,\ + "nettyThreads":2,\ + "codec":{\ + "class":"org.redisson.client.codec.StringCodec"\ + },\ + "transportMode":"NIO"\ + } diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java index 69146706d..4be34f44b 100755 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java @@ -821,7 +821,7 @@ public class ExcelWriteTest { } @Test - //@Ignore + @Ignore public void writeDoubleTest() { // https://gitee.com/dromara/hutool/issues/I5PI5C final String path = "d:/test/doubleTest.xlsx";