码迷,mamicode.com
首页 > 编程语言 > 详细

Java.util.zip adding a new file overwrites entire jar?(转)

时间:2015-02-04 16:28:57      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

 

I am using java.util.zip to add some configuration resources into a jar file. when I call addFileToZip() method it overwrites the jar completely, instead of adding the file to the jar. Why I need to write the config to the jar is completely irrelevant. and I do not wish to use any external API‘s.

EDIT: The jar is not running in the VM and org.cfg.resource is the package I‘m trying to save the file to, the file is a standard text document and the jar being edited contains the proper information before this method is used.

My code:

public void addFileToZip(File fileToAdd, File zipFile)
{
    ZipOutputStream zos = null;
    FileInputStream fis = null;
    ZipEntry ze = null;
    byte[] buffer = null;
    int len;

    try {
        zos = new ZipOutputStream(new FileOutputStream(zipFile));
    } catch (FileNotFoundException e) {
    }

    ze = new ZipEntry("org" + File.separator + "cfg" + 
            File.separator + "resource" + File.separator + fileToAdd.getName());
    try {
        zos.putNextEntry(ze);

        fis = new FileInputStream(fileToAdd);
        buffer = new byte[(int) fileToAdd.length()];

        while((len = fis.read(buffer)) > 0)
        {
            zos.write(buffer, 0, len);
        }           
    } catch (IOException e) {
    }
    try {
        zos.flush();
        zos.close();
        fis.close();
    } catch (IOException e) {
    }
}

The code you showed overrides a file no matter if it would be a zip file or not. ZipOutputStream does not care about existing data. Neither any stream oriented API does.

I would recommend

  1. Create new file using ZipOutputStream.

  2. Open existing with ZipInputStream

  3. Copy existing entries to new file.

  4. Add new entries.

  5. Replace old file with a new one.


Hopefully in Java 7 we got Zip File System that will save you a lot of work.

We can directly write to files inside zip files

Map<String, String> env = new HashMap<>(); 
env.put("create", "true");
Path path = Paths.get("test.zip");
URI uri = URI.create("jar:" + path.toUri());
try (FileSystem fs = FileSystems.newFileSystem(uri, env))
{
    Path nf = fs.getPath("new.txt");
    try (Writer writer = Files.newBufferedWriter(nf, StandardCharsets.UTF_8, StandardOpenOption.CREATE)) {
        writer.write("hello");
    }
}

 

 

http://stackoverflow.com/questions/17500856/java-util-zip-adding-a-new-file-overwrites-entire-jar?lq=1

 

Java.util.zip adding a new file overwrites entire jar?(转)

标签:

原文地址:http://www.cnblogs.com/softidea/p/4272451.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!