package com.guokr.protocol.xcf; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; public class XcfJarConnection extends XcfConnection { public XcfJarConnection(URL base, URL url) { super(base, url); } @Override public List<InputStream> list(URL base, String find, String pattern) throws IOException { String basepath = base.getPath(); basepath = basepath.substring(5, basepath.lastIndexOf('!')); StringBuilder regex = new StringBuilder("^"); regex.append(find.substring(1)); if (pattern != null) { regex.append("\\.part."); for (int i = 0; i < pattern.length(); i++) { regex.append("\\d"); } } regex.append("$"); final Pattern pat = Pattern.compile(regex.toString()); final JarFile jar = new JarFile(basepath); final Enumeration<JarEntry> entries = jar.entries(); List<String> paths = new ArrayList<String>(); while (entries.hasMoreElements()) { final String name = entries.nextElement().getName(); if (pat.matcher(name).find()) { String url = String.format("jar:file://%s!/%s", basepath, name); paths.add(url); } } jar.close(); Collections.sort(paths); List<URL> urls = new ArrayList<URL>(); for (String path : paths) { urls.add(new URL(path)); } List<InputStream> inputs = new ArrayList<InputStream>(); if (urls.size() == 1) { inputs.add(urls.get(0).openStream()); } else { for (URL url : urls) { inputs.add(new GZIPInputStream(url.openStream())); } } return inputs; } }