如何将未压缩的文件转换成压缩的字节?

sc4hvdpw  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(520)

在java for a junit测试中,我试图模拟一个函数,该函数从另一个外部api的端点下载zip文件。为了模拟下载,我需要压缩一个测试文件并将其转换为字节以用作mock的返回值。我不需要将压缩文件写回文件系统,而是使用原始字节。

mock(zipReturner.getZipBytes()).thenReturn(testFileAsZippedBytes("testFile.txt"))
private Optional<byte[]> testFileAsZippedBytes(String testFile) {
  ???
}
lhcgjxsq

lhcgjxsq1#

分享我的答案,因为我发现的所有其他示例都要重得多,需要更多的代码行在字节上循环,或者需要使用外部库来做同样的事情。
要在没有上述内容的情况下执行此操作,请使用bytearrayoutputstream的组合,因为它具有 toByteArray 函数,zipoutputstream将压缩字节写入bytearrayoutputstream和fileinputstream,从文件系统读取测试文件。

private Optional<byte[]> testFileAsZippedBytes(String filePath, String fileName) throws IOException {
  try (
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream);
    FileInputStream fileInputStream = new FileInputStream(filePath + fileName);
  ) {
    ZipEntry zipEntry = new ZipEntry(fileName);
    zipOutputStream.putNextEntry(zipEntry);
    zipOutputStream.write(fileInputStream.readAllBytes());
    zipOutputStream.finish();
    return Optional.of(byteArrayOutputStream.toByteArray());
  }
}

使用 ZipEntry 将文件作为条目添加到 ZipOutputStream 并将字节写入zip。使用 zipOutputStream.finish() 以确保所有内容都已写入流并准备好在流中使用 ByteArrayOutputStream ,否则,根据我的经验,您只能在调用时获取部分数据 byteArrayOutputStream.toByteArray() .

相关问题