Java tutorial
/* * * * Copyright 2005 Vincent Massol. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * */ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; /** * Some utility classes for manipulating JAR files. * * @version $Id $ */ public final class JarUtils { /** * Create a jar file from a particular directory. * * @param root in the root directory * @param directory in the directory we are adding * @param jarStream the jar stream to be added to * @throws IOException on IOException */ protected void createJarFromDirectory(File root, File directory, JarOutputStream jarStream) throws IOException { byte[] buffer = new byte[40960]; int bytesRead; File[] filesToAdd = directory.listFiles(); for (int i = 0; i < filesToAdd.length; i++) { File fileToAdd = filesToAdd[i]; if (fileToAdd.isDirectory()) { createJarFromDirectory(root, fileToAdd, jarStream); } else { FileInputStream addFile = new FileInputStream(fileToAdd); try { // Create a jar entry and add it to the temp jar. String entryName = fileToAdd.getPath().substring(root.getPath().length() + 1); // If we leave these entries as '\'s, then the resulting zip file won't be // expandable on Unix operating systems like OSX, because it is possible to // have filenames with \s in them - so it's impossible to determine that this // is actually a directory. entryName = entryName.replace('\\', '/'); JarEntry entry = new JarEntry(entryName); jarStream.putNextEntry(entry); // Read the file and write it to the jar. while ((bytesRead = addFile.read(buffer)) != -1) { jarStream.write(buffer, 0, bytesRead); } jarStream.closeEntry(); } finally { addFile.close(); } } } } /** * Create a JAR file from a directory, recursing through children. * * @param directory in directory source * @param outputJar in file to output the jar data to * @return out File that was generated * @throws IOException when there is an I/O exception */ public File createJarFromDirectory(String directory, File outputJar) throws IOException { JarOutputStream jarStream = null; try { if (!outputJar.getParentFile().exists()) { outputJar.getParentFile().mkdirs(); } jarStream = new JarOutputStream(new FileOutputStream(outputJar)); File dir = new File(directory); createJarFromDirectory(dir, dir, jarStream); } finally { if (jarStream != null) { jarStream.close(); } } return outputJar; } }