用如下代码将工程目录中的res\test.jar复制到D:\Test下,发现System.out.println(entry.getName())没有输出“META-INFO/MANIFEST.MF”这项,在D:\Test\test.jar中,其它的JarEntry都复制过来了,就是少了"META-INFO"文件夹和该文件夹下的.MF文件。请问这是怎么回事呢??谢谢....
public static void jarCopy_JarEntry() {
try {
JarInputStream jarIn = new JarInputStream(new FileInputStream(
"res//test.jar"));
JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(
"D://Test//test.jar"));
byte[] buf = new byte[4096];
JarEntry entry;
while ((entry = jarIn.getNextJarEntry()) != null) {
System.out.println(entry.getName());
jarOut.putNextEntry(entry);
int read;
while ((read = jarIn.read(buf)) != -1) {
jarOut.write(buf, 0, read);
}
jarOut.closeEntry();
}
jarOut.flush();
jarOut.close();
jarIn.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("OK");
}

解决方案 »

  1.   

     public static void jarCopy_JarEntry() {
            try {
                JarInputStream jarIn = new JarInputStream(new FileInputStream(
                        "D:\\jacob.jar"));
                Manifest manifest = jarIn.getManifest();//manifest.......
                JarOutputStream jarOut;
                if(manifest != null) {
                 jarOut = new JarOutputStream(new FileOutputStream(
                 "D:\\jacob2.jar"),manifest);
                
                }else {
                 jarOut = new JarOutputStream(new FileOutputStream(
                 "D:\\jacob2.jar"));
                }
                
                byte[] buf = new byte[4096];
                JarEntry entry;
                
                while ((entry = jarIn.getNextJarEntry()) != null) {
                    System.out.println(entry.getName());
                    jarOut.putNextEntry(entry);
                    int read;
                    while ((read = jarIn.read(buf)) != -1) {
                        jarOut.write(buf, 0, read);
                    }
                    jarOut.closeEntry();
                }
                
                
                jarOut.flush();
                jarOut.close();
                jarIn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("OK");
        }
      

  2.   

    JarOutputStream
    public JarOutputStream(OutputStream out)
                    throws IOException
    Creates a new JarOutputStream with no manifest. 
    JarOutputStream
    public JarOutputStream(OutputStream out,
                           Manifest man)
                    throws IOException
    Creates a new JarOutputStream with the specified Manifest. The manifest is written as the first entry to the output stream. 
    明白了,谢谢...