Lista plikó w jar

0

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

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);
			}
		}
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1