CSV 文件在压缩后被更改为字节数组

CSV Fille is altered after compression as byte array

所以我从前端收到一个 CSV 文件,我需要压缩它并将其存储到 MySql 数据库中。问题是,在我解压缩文件后,它被更改并且不再具有 CSV 结构(我使用 ZIP 压缩,但我也尝试过 gzip)。例如这是压缩前的文件

header1,header2,header3,header4,header5
val,val2,val3,val4,val5
val6,val7,val8,val9,val10

这是解压后的文件

header1,header2,header3,header4,header5val1,val2,val3,val4,val5val6,val7,val8.val9.val10

我需要将解压后的文件发送到python时间序列分析服务,它无法正确解析。

我 compress/decompress 文件直接作为 byteArray,我确信压缩是问题所在,因为我已经尝试存储和获取未压缩的 CSV,但它工作正常。 提前致谢!

这里是用于压缩的代码

@Throws(Exception::class)
fun compressFile(file : ByteArray) : ByteArray {
   val baos = ByteArrayOutputStream()
   val zos = ZipOutputStream(baos)
   val entry = ZipEntry("data.csv")
   entry.size = file.size.toLong()
   zos.putNextEntry(entry)
   zos.write(file)
   zos.closeEntry()
   zos.close()
   return baos.toByteArray()
}

这里是解压用的代码

@Throws(Exception::class)
fun decompressFile(file : ByteArray): ByteArray {
   if (file.isEmpty()) return file
   val gis = ZipInputStream(ByteArrayInputStream(file))
   gis.nextEntry
   val bf = BufferedReader(InputStreamReader(gis, "UTF-8"))
   var outStr = ""
   var line: String
   while (bf.readLine().also { line = it ?: "" } != null) {
       outStr += line
   }
   gis.close()
   bf.close()
   return outStr.toByteArray()
}

我想,你丢失了 NL 字符,因为 BufferedReader.readLine() 只读取了最后一行没有新行的行。也就是说,您连接了 Line1Line2,但跳过了它们之间的新行。

您不应该通过 bufferedreader 读取流,您需要读取整个内容,包括换行符,请参阅 https://www.baeldung.com/convert-input-stream-to-string