【发布时间】:2020-04-15 17:30:04
【问题描述】:
所以我试图将一个 csv 文件压缩到内存中,将其作为 BLOB 存储在 MYSQL 中,然后获取并解压缩它,但是 ZipInputStream.getEntry 返回 null 并且我真的无法解压缩该文件,我尝试了一切并我真的找不到答案。 我第一次使用 GZIP 压缩/解压缩文件并工作,但它改变了 CSV 文件结构,所以这就是我尝试使用 Zip 的原因。 CSV 文件是通过 Spring 的 MultipartFile.getBytes() 从前端接收的。
这是从 DB 看到的压缩文件头 (标题似乎有效)
00000000 50 4B 03 04 14 00 08 08 08 00 B4 A0 8F 50 00 00 PK........´ .P..
提前致谢!
压缩方式:
@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))
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()
}
【问题讨论】:
-
你从不打电话给
getNextEntry(),所以你认为你正在阅读哪个邮编? -
@Andreas 我不需要调用 getNextEntry 因为我直接从流中读取(至少 GZIP 以这种方式工作),但我也尝试了 getNetEntry 并且它返回 null,你可以检查我链接的图像下面使用创建的 ZipInputStream 对象。
-
GZIP 不是 ZIP。 --- 不知道图像显示什么。这是你打电话给
getNextEntry()之前或之后的状态吗? -
@Andreas 好的,那么如果 ZipInputStream 条目为空,我如何将文件解压缩为字节数组?
-
@Andreas 或者至少为什么 GZIP 会更改我的 CSV 文件?用gzip压缩前的文件是header1,header2,header3 new line val1,val2,val3 压缩后 -> header1,header2,header3val1,val2,val3
标签: java file csv kotlin compression