Witam
Jak moge pobrac liste plikó które znajduja sie w folderze, w pliku jar? Dokładniej chodzi mi o to, ze jezeli w jar mam class i folder res, to jak pobrac liste plików znajdujących sie w folderze res? Próbowałem z getClass().getResources(), z URI i inymi kompinacjami, ale zawsze zwracało mi sciezke na dysku, albo jakies inne błedy. Uruchamiając program z NetBeans nie ma problemu, ale jak juz spakuje wszystko do jar to pojawia sie problem.
0
0
Aby otrzymać listę wszystkich plików w jarze, można napisać:
((JarURLConnection) getClass().getResource("").openConnection()).getJarFile().entries()
Kiedyś napisałem uniwersalny poszukiwacz zasobów, który działa zarówno gdy pliki nie są jeszcze w jarze (np. gdy pracujemy w eclipse), jak i później po wrzuceniu ich do jara.
Metoda scan zwraca wszystkie zasoby, których nazwa spełnia kryterium.
scanValues zwraca ich treść
scanKeys zwraca tylko ich nazwy
np.
ContextScanner.scanValues(Pattern.compile(".*Level.*xml"));
Wywołanie to zwraca treść (InputStream) wszystkich plików, które mają w nazwie "Level" i później "xml". Pliki te mogą znajdować się w dowolnym katalogu projektu/jara.
Jeżeli będziesz używać tego tylko przez jara, to możesz podać też katalog, np. ContextScanner.scanValues(Pattern.compile("levels/Level.*xml"));
public class ContextScanner {
public static Map<String, InputStream> scan(final Pattern pattern) {
try {
final URLConnection connection = ContextScanner.class.getResource("").openConnection();
if (connection instanceof JarURLConnection) {
JarFile jarfile = ((JarURLConnection) connection).getJarFile();
return scanJar(jarfile, pattern);
}
File root = new File(ContextScanner.class.getResource("/").toURI());
return scanDirectory(root, pattern);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static List<InputStream> scanValues(final Pattern pattern) {
return new ArrayList<InputStream>(scan(pattern).values());
}
public static List<String> scanKeys(final Pattern pattern) {
return new ArrayList<String>(scan(pattern).keySet());
}
private static Map<String, InputStream> scanJar(JarFile jarfile, final Pattern pattern)
throws IOException {
Map<String, InputStream> ret = new HashMap<String, InputStream>();
for (Enumeration<JarEntry> em1 = jarfile.entries(); em1.hasMoreElements();) {
JarEntry jarEntry = em1.nextElement();
String name = jarEntry.getName();
if (pattern.matcher(name).matches()) {
String[] names = name.split("/");
ret.put(names[names.length-1], (InputStream) ContextScanner.class.getResource("/" + name).openStream());
}
}
return ret;
}
private final static class DirectoryFilter implements FilenameFilter {
public boolean accept(File file, String name) {
return file.isDirectory();
}
private final static FilenameFilter directoryFilter = new DirectoryFilter();
public static FilenameFilter getDirectoryFilter() {
return directoryFilter;
}
}
private static Map<String, InputStream> scanDirectory(File root, final Pattern pattern) {
final FilenameFilter fileFilter = new FilenameFilter() {
public boolean accept(File file, String name) {
return pattern.matcher(name).matches();
}
};
Map<String, InputStream> ret = new HashMap<String, InputStream>();
scanDirectory(root, fileFilter, ret);
return ret;
}
private static void scanDirectory(File root, FilenameFilter fileFilter,
Map<String, InputStream> acc) {
File[] files = root.listFiles(fileFilter);
File[] dirs = root.listFiles(DirectoryFilter.getDirectoryFilter());
if (files != null) {
for (File file : files) {
try {
acc.put(file.getName(), new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
if (dirs != null) {
for (File dir : dirs) {
scanDirectory(dir, fileFilter, acc);
}
}
}
}