src/main/java/com/github/ricksbrown/cowsay/Cowloader.java
public static String[] listAllCowfiles() {
		String[] resultAsArray;
		String[] bundled = null;
		String cowfileExtRe = "\\" + COWFILE_EXT + "$";
		InputStream bundleStream = Cowloader.class.getResourceAsStream("/cowfile-list.csv");
		if (bundleStream != null) {
			BufferedReader reader = new BufferedReader(new InputStreamReader(bundleStream));
			StringBuilder sb = new StringBuilder();
			try {
				String line;
				while ((line = reader.readLine()) != null) {
					sb.append(line);
				}
				reader.close();
				String bundleList = sb.toString();
				bundled = bundleList.split(",");
			} catch (IOException ex) {
				Logger.getLogger(Cowloader.class.getName()).log(Level.WARNING, null, ex);
			} finally {
				try {
					bundleStream.close();
				} catch (IOException ex) {
					Logger.getLogger(Cowloader.class.getName()).log(Level.SEVERE, null, ex);
				}
			}
		}

		Set<String> result = new HashSet<String>();
		if (bundled != null) {
			for (String cowfile : bundled) {
				if (cowfile.endsWith(COWFILE_EXT)) {  // mech-and-cow for example is not a cowfile and should be excluded
					result.add(cowfile.replaceAll(cowfileExtRe, ""));
				}
			}
		}
		String cowPath = System.getenv("COWPATH");
		if (cowPath != null) {
			String[] paths = cowPath.split(File.pathSeparator);
			if (paths != null) {
				for (String path : paths) {
					File[] cowfiles = getCowFiles(path);
					if (cowfiles != null) {
						for (File cowfile : cowfiles) {
							result.add(cowfile.getName().replaceAll(cowfileExtRe, ""));
						}
					}
				}
			}
		}
		resultAsArray = result.toArray(new String[result.size()]);
		Arrays.sort(resultAsArray);
		return resultAsArray;

	}
public static String[] listAllCowfiles() {
		String[] resultAsArray;
		String[] bundled = null;
		String cowfileExtRe = "\\" + COWFILE_EXT + "$";
		InputStream bundleStream = Cowloader.class.getResourceAsStream("/cowfile-list.csv");
		if (bundleStream != null) {
			BufferedReader reader = new BufferedReader(new InputStreamReader(bundleStream));
			StringBuilder sb = new StringBuilder();
			try {
				String line;
				while ((line = reader.readLine()) != null) {
					sb.append(line);
				}
				reader.close();
				String bundleList = sb.toString();
				bundled = bundleList.split(",");
			} catch (IOException ex) {
				Logger.getLogger(Cowloader.class.getName()).log(Level.WARNING, null, ex);
			} finally {
				try {
					bundleStream.close();
				} catch (IOException ex) {
					Logger.getLogger(Cowloader.class.getName()).log(Level.SEVERE, null, ex);
				}
			}
		}

		Set<String> result = new HashSet<String>();
		if (bundled != null) {
			for (String cowfile : bundled) {
				if (cowfile.endsWith(COWFILE_EXT)) {  // mech-and-cow for example is not a cowfile and should be excluded
					result.add(cowfile.replaceAll(cowfileExtRe, ""));
				}
			}
		}
		String cowPath = System.getenv("COWPATH");
		if (cowPath != null) {
			String[] paths = cowPath.split(File.pathSeparator);
			if (paths != null) {
				for (String path : paths) {
					File[] cowfiles = getCowFiles(path);
					if (cowfiles != null) {
						for (File cowfile : cowfiles) {
							result.add(cowfile.getName().replaceAll(cowfileExtRe, ""));
						}
					}
				}
			}
		}
		resultAsArray = result.toArray(new String[result.size()]);
		Arrays.sort(resultAsArray);
		return resultAsArray;

	}
List the names of all cowfiles found when searching COWPATH (including bundled cowfiles).
Primarily useful for the "-l" commandline flag and also handy for unit testing.
@return The names of available cowfiles.