-
Notifications
You must be signed in to change notification settings - Fork 496
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BUG] CSVWriter 写入CSV数据超过 65536 个字节时报错 #2848
Comments
堆栈信息可以发一下么? |
简单的堆栈信息就是我上面发的,线上环境的堆栈信息在记录日志时做了精简,只会显示最近2行 + 本应用包名开头的,所以暂时没有完整的堆栈信息。 我们目前是临时通过 每 |
通过上述简单关键堆栈信息里的 报错文件名称 和 行数,再结合报错异常分析,也能定位到具体的问题。 在这里,把 |
如果这里有问题,应该是很多个地方都会有问题,应该是某个地方的offset计算错了,你本地方便做调试么?看调用这个之前是什么操作,最后一列是什么类型? |
try (CSVWriter writer = CSVWriter.of()) {
writer.writeValue("1".repeat(65531));
writer.writeComma();
writer.writeValue(new BigDecimal("1.00"));
writer.writeComma(); // java.lang.ArrayIndexOutOfBoundsException: Index 65536 out of bounds for length 65536
} 前几天比较忙,今天调试了一下,发现 write BigDecimal 刚好达到 65536 时,内部并没有 |
https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.53-SNAPSHOT/ |
@wenshao 用新版本测试了下,writeBigDecimal 的问题已经解决了,不过又发现了一个类似的 bug。 OutputStreamWriter out = new OutputStreamWriter(new ByteArrayOutputStream(), StandardCharsets.UTF_8);
try (CSVWriter writer = CSVWriter.of(out)) {
writer.writeValue("1".repeat(65534));
writer.writeComma();
writer.writeString("123"); // java.lang.StringIndexOutOfBoundsException: offset 65535, count 3, length 65536
} fastjson2/core/src/main/java/com/alibaba/fastjson2/support/csv/CSVWriterUTF16.java Lines 141 to 149 in a122b8d
定位了下,如上所示,是 错误堆栈信息如下:
发现这些 bug 有些随机,必须要恰好构造出符合特定条件的数据才能出现。 |
@wenshao
我先构造一个 65535 容量的 Writer buffer,然后依次调用每一个 OutputStreamWriter out = new OutputStreamWriter(new ByteArrayOutputStream(), StandardCharsets.UTF_8);
try (CSVWriter writer = CSVWriter.of(out)) {
writer.writeValue("1".repeat(65534));
writer.writeComma();
writer.writeLocalDateTime(LocalDateTime.now()); // java.lang.ArrayIndexOutOfBoundsException: Index 65539 out of bounds for length 65536
// 【writeInstant(Instant instant) 也受此影响】
} 还有 OutputStreamWriter out = new OutputStreamWriter(new ByteArrayOutputStream(), StandardCharsets.UTF_8);
try (CSVWriter writer = CSVWriter.of(out)) {
writer.writeValue("1".repeat(65534));
writer.writeComma();
writer.writeString("2".repeat(65537)); // java.lang.StringIndexOutOfBoundsException: offset 65535, count 65537, length 65536
// 【CSVWriterUTF16.writeString(byte[] utf8) 也受此影响】
} |
问题描述
我们使用 Fastjson2 用于生成 CSV 格式的数据文件。
写入少量数据时,一切表现正常。
然而,当写入超过 65536 个字节的数据时,就会触发如下数组越界异常 。
通过异常堆栈信息得知报错代码位置如下:
fastjson2/core/src/main/java/com/alibaba/fastjson2/support/csv/CSVWriterUTF8.java
Lines 48 to 53 in a122b8d
如果之前
CSVWriterUTF8.off
已经是 65536,本次再调用writeComma()
方法时,由于bytes.length
固定是 65536,并不满足if( off + 1 == bytes.length )
的if
条件,因此触发越界异常。此外,我们恰好在该数据量边界写入的是字符串,也得到了一个类似的异常:
环境信息
请填写以下信息:
期待的正确结果
正常写入,不再报错。
The text was updated successfully, but these errors were encountered: