Java CSV填充在压缩后更改为字节数组

Java CSV填充在压缩后更改为字节数组,java,file,csv,kotlin,compression,Java,File,Csv,Kotlin,Compression,所以我从前端收到一个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,v

所以我从前端收到一个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
@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()
}
这是解压缩后的文件

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
@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()
}
我需要将解压缩后的文件发送到python时间序列分析服务,它无法正确解析它

我直接将文件作为字节数组进行压缩/解压缩,我确信压缩是问题所在,因为我尝试存储和获取未压缩的CSV,它工作正常。 提前谢谢

下面是用于压缩的代码

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
@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()
}
下面是用于解压缩的代码

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
@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读取流,您需要读取整个内容,包括新行字符,请参阅

另请参见相关的感谢!它可以工作,不知道readLine跳过NL转义,还有@gidds,也谢谢你,非常好的资源。