java 使用Java访问类路径中特定文件夹中的文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13848333/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Accessing files in specific folder in classpath using Java
提问by Akadisoft
I want to read a bunch of text files in com.example.resources package. I can read a single file using the following code:
我想读取 com.example.resources 包中的一堆文本文件。我可以使用以下代码读取单个文件:
InputStream is = MyObject.class.getResourceAsStream("resources/file1.txt")
InputStreamReader sReader = new InputStreamReader(is);
BefferedReader bReader = new BufferedReader(sReader);
...
Is there a way to get the listing of file and then pass each element to getResourceAsStream
?
有没有办法获取文件列表,然后将每个元素传递给getResourceAsStream
?
EDIT: On ramsinb suggestion I changed my code as follow:
编辑:根据 ramsinb 的建议,我将代码更改如下:
BufferedReader br = new BufferedReader(new InputStreamReader(MyObject.class.getResourceAsStream("resources")));
String fileName;
while((fileName = br.readLine()) != null){
// access fileName
}
采纳答案by ramsinb
If you pass in a directory to the getResourceAsStream
method then it will return a listing of files in the directory ( or at least a stream of it).
如果您将目录传递给该getResourceAsStream
方法,则它将返回目录中的文件列表(或至少是其中的一个流)。
Thread.currentThread().getContextClassLoader().getResourceAsStream(...)
I purposely used the Thread to get the resource because it will ensure I get the parent class loader. This is important in a Java EE environment however probably not too much for your case.
我特意使用 Thread 来获取资源,因为它将确保我获得父类加载器。这在 Java EE 环境中很重要,但对于您的情况可能不是太多。
回答by Viral Patel
This SO threaddiscuss this technique in detail. Below is a useful Java method that list files from a given resource folder.
这个 SO 线程详细讨论了这项技术。下面是一个有用的 Java 方法,用于列出给定资源文件夹中的文件。
/**
* List directory contents for a resource folder. Not recursive.
* This is basically a brute-force implementation.
* Works for regular files and also JARs.
*
* @author Greg Briggs
* @param clazz Any java class that lives in the same place as the resources you want.
* @param path Should end with "/", but not start with one.
* @return Just the name of each member item, not the full paths.
* @throws URISyntaxException
* @throws IOException
*/
String[] getResourceListing(Class clazz, String path) throws URISyntaxException, IOException {
URL dirURL = clazz.getClassLoader().getResource(path);
if (dirURL != null && dirURL.getProtocol().equals("file")) {
/* A file path: easy enough */
return new File(dirURL.toURI()).list();
}
if (dirURL == null) {
/*
* In case of a jar file, we can't actually find a directory.
* Have to assume the same jar as clazz.
*/
String me = clazz.getName().replace(".", "/")+".class";
dirURL = clazz.getClassLoader().getResource(me);
}
if (dirURL.getProtocol().equals("jar")) {
/* A JAR path */
String jarPath = dirURL.getPath().substring(5, dirURL.getPath().indexOf("!")); //strip out only the JAR file
JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8"));
Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
Set<String> result = new HashSet<String>(); //avoid duplicates in case it is a subdirectory
while(entries.hasMoreElements()) {
String name = entries.nextElement().getName();
if (name.startsWith(path)) { //filter according to the path
String entry = name.substring(path.length());
int checkSubdir = entry.indexOf("/");
if (checkSubdir >= 0) {
// if it is a subdirectory, we just return the directory name
entry = entry.substring(0, checkSubdir);
}
result.add(entry);
}
}
return result.toArray(new String[result.size()]);
}
throw new UnsupportedOperationException("Cannot list files for URL "+dirURL);
}
回答by Anton Hell
I think thats what you want:
我认为这就是你想要的:
String currentDir = new java.io.File(".").toURI().toString();
// AClass = A class in this package
String pathToClass = AClass.class.getResource("/packagename).toString();
String packagePath = (pathToClass.substring(currentDir.length() - 2));
String file;
File folder = new File(packagePath);
File[] filesList= folder.listFiles();
for (int i = 0; i < filesList.length; i++)
{
if (filesList[i].isFile())
{
file = filesList[i].getName();
if (file.endsWith(".txt") || file.endsWith(".TXT"))
{
// DO YOUR THING WITH file
}
}
}