How To Load All The Resources From Within a Package
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class Initializer {
private static final Log LOG = LogFactory.getLog(Initializer.class);
/**
* gets the xmls
*
* @return
*/
private Set<String> getXmls() {
final Set<String> xmls = new LinkedHashSet<String>();
try {
final Class<? extends Object> clazz = Initializer.class;
final String className = clazz.getSimpleName() + ".class";
final String classPath = clazz.getResource(className).toString();
if (classPath.startsWith("jar")) {
LOG.info("loading xml's from the jar");
final String xmlPath = "<your path>";
final String path = Thread.currentThread().getContextClassLoader().getResource(xmlPath).toString();
final String jarFilePath = path.substring(path.indexOf("/"), path.indexOf("!"));
final ZipFile zipFile = new JarFile(jarFilePath);
for (final Enumeration<? extends ZipEntry> enumeration = zipFile.entries(); enumeration.hasMoreElements();)
{
final ZipEntry zipEntry = enumeration.nextElement();
final String name = zipEntry.getName();
if (!name.startsWith(xmlPath) || !name.endsWith(".xml")) {
continue;
}
LOG.info("loading l xml name=" + name);
final StringBuilder builder = getStringBuilderFromFileNameJar(name);
xmls.add(builder.toString());
}
} else {
final String[] fileNames = getXMLFileNames();
for (final String fileName : fileNames) {
final StringBuilder builder = getStringBuilderFromFileNameFolder(fileName);
xmls.add(builder.toString());
}
}
} catch (final Exception e) {
LOG.error("ERROR Loading the XML from within the jar");
LOG.info("getXML error: ", e);
}
return xmls;
}
private StringBuilder getStringBuilderFromFileNameFolder(final String fileName) {
final InputStream asStream = this.getClass().getResourceAsStream(fileName);
try {
return load(asStream, fileName);
} finally {
try {
asStream.close();
} catch (IOException e) {
LOG.error(e);
}
}
}
@Nullable
private StringBuilder getStringBuilderFromFileNameJar(final String resourceName) {
final InputStream asStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName);
try {
return load(asStream, resourceName);
} finally {
try {
asStream.close();
} catch (IOException e) {
LOG.error(e);
}
}
}
private StringBuilder load(InputStream asStream, String resourceName) {
final StringBuilder builder = new StringBuilder();
// about 10K
byte b[] = new byte[1024 * 10];
do {
try {
final int len = asStream.read(b, 0, b.length);
if (len == -1)
break;
builder.append(new String(b, 0, len));
} catch (final IOException e) {
LOG.error("unable to read " + resourceName);
}
} while (true);
return builder;
}
private String[] getXMLFileNames() {
final URL dirURL = getDir();
final String[] fileNames;
final FilenameFilter filter = new FilenameFilter() {
public boolean accept(final File dir, final String name) {
return name.endsWith(".xml"); // To change body of implemented
}
};
// do if we are in a jar we will have to come up with another way to get
// the list of files
try {
fileNames = new File(dirURL.toURI()).list(filter);
} catch (final URISyntaxException e) {
throw new IllegalStateException("unable to load xmls", e);
}
return fileNames;
}
private URL getDir() {
return this.getClass().getClassLoader().getResource("<root path>");
}
public static void main(final String... arg) {
System.out.println(new Initializer().getXmls());
}
page revision: 2, last edited: 26 Mar 2013 05:10