将字节数组中的文件写入zip文件

时间:2015-05-14 09:49:57

标签: java zipfile

我试图写一个文件名"内容"从字节数组到现有的zip文件。

到目前为止我已经管理了一个文本文件\将一个特定的文件添加到同一个zip中。 我尝试做的事情是相同的,只是代替文件,代表文件的字节数组。我正在编写这个程序,因此它可以在服务器上运行,因此我无法在某处创建物理文件并将其添加到zip中,这一切都必须在内存中进行。

这是我的代码到目前为止没有"将字节数组写入文件"一部分。

public static void test(File zip, byte[] toAdd) throws IOException {

    Map<String, String> env = new HashMap<>();
    env.put("create", "true");
    Path path = Paths.get(zip.getPath());
    URI uri = URI.create("jar:" + path.toUri());

    try (FileSystem fs = FileSystems.newFileSystem(uri, env)) {

        Path nf = fs.getPath("avlxdoc/content");
         try (BufferedWriter writer = Files.newBufferedWriter(nf, StandardOpenOption.CREATE)) {
             //write file from byte[] to the folder
            }


    }
}

(我尝试使用BufferedWriter,但它似乎没有用......)

谢谢!

2 个答案:

答案 0 :(得分:1)

不要使用BufferedWriter来编写二进制内容! Writer用于撰写 text 内容。

请改用:

final Path zip = file.toPath();

final Map<String, ?> env = Collections.emptyMap();
final URI uri = URI.create("jar:" + zip.toUri());

try (
    final FileSystem zipfs = FileSystems.newFileSystem(uri, env);
)  {
    Files.write(zipfs.getPath("into/zip"), buf,
        StandardOpenOption.CREATE, StandardOpenOption.APPEND);
}

(注意:APPEND在这里是猜测;如果文件已经存在,它会从您的问题中查找您要附加的内容;默认情况下,内容将被覆盖)

答案 1 :(得分:0)

您应该使用ZipOutputStream来访问压缩文件。

ZipOutputStream允许您根据需要向存档添加条目,指定条目的名称和内容的字节。

如果你有一个名为theByteArray的变量,这里有一个片段,可以在zip文件中添加一个条目:

ZipOutputStream zos =  new ZipOutputStream(/* either the destination file stream or a byte array stream */);
/* optional commands to seek the end of the archive */
zos.putNextEntry(new ZipEntry("filename_into_the_archive"));
zos.write(theByteArray);
zos.closeEntry();
try {
    //close and flush the zip
    zos.finish();
    zos.flush();
    zos.close();
}catch(Exception e){
    //handle exceptions
}