package com.commons.loadfile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Stack;
/**
* 运用"广度优先算法" 遍历ClassPath文件结构,搜索用户输入文件名对应文件,并返回该文件在类路径下的全路径名,
* 如:com/mystruts/struts.xml
* 可用于加载任意ClassPath路径下的配置文件(.xml,.properties等)
* @author Leo 2009-8-12 22:30:56
*
*/
public final class FileLoadUtil {
/**
* 内部类 文件(包括文件夹)信息Bean
* @author Administrator
*
*/
class FileInfo{
File file;
String classPath;
public FileInfo(File file,String classPath) {
super();
this.file = file;
this.classPath = classPath;
}
}
private String result =null; //返回的文件在ClassPath下的全路径名
public String getFilePath(String resource){
String baseRealClassPath= FileLoadUtil.class.getResource("/").getPath(); //取得当前系统的classpath根的绝对路径
File rootDir = new File(baseRealClassPath);
FileInfo rootInfo= new FileInfo(rootDir , "");
Stack<FileInfo> stack = new Stack<FileInfo>();
stack.push(rootInfo);
dealLevel(stack , resource );
return result;
}
/**
* 递归处理同一层次的文件集合
* @param stack
* @param fname
*/
private void dealLevel(Stack<FileInfo> stack , String fname ) {
if(stack==null || stack.size()==0) return;
Stack<FileInfo> st = new Stack<FileInfo>();
int i =stack.size();
for(;i!=0;i--) {
FileInfo info = stack.pop();
result = dealElement(info,fname,st);
if(result!=null && result.length()>0)
return;
}
if(st==null || st.size()==0) {
return;
}else {
dealLevel(st, fname);
}
}
/**
* 处理单个文件 或 目录
* @param info
* @param fname
* @param stack
* @return
*/
private String dealElement(FileInfo info ,String fname, Stack<FileInfo> stack) {
if(info==null || info.file==null) return null;
if(info.file.isFile()) {
// System.out.println("=========" + info.classPath);
if(compareFileName(info.file , fname)) {
return info.classPath;
}
} else {
File[] files = info.file.listFiles();
if(files==null && files.length==0) return null;
for(File f : files) {
FileInfo fi = new FileInfo(f , ("").equals(info.classPath) ? info.classPath + f.getName() :info.classPath + "/"+ f.getName() );
stack.push(fi);
}
}
return null;
}
/**
*
* @param file
* @param fileName
* @return
*/
private boolean compareFileName(File file ,String fileName) {
if(file==null || fileName==null) return false;
// System.out.println(file.getName());
if(file.getName().equals(fileName)) {
return true;
}
return false;
}
/**
* 测试入口方法
* @param args
*/
public static void main(String[] args) {
FileLoadUtil wf = new FileLoadUtil();
String fileClassPath = wf.getFilePath("jdbc.properties");
System.out.println("获得的文件的类路径: " + fileClassPath);
Properties p = new Properties();
InputStream is = FileLoadUtil.class.getClassLoader().getResourceAsStream(fileClassPath);
try {
p.load(is);
System.out.println(p.getProperty("jdbc.driverClassName"));
System.out.println(p.getProperty("jdbc.url"));
} catch (IOException e) {
e.printStackTrace();
} finally {
if(is!=null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
分享到:
相关推荐
4. 如果要加载的资源,不在当前 ClassLoader 的路径里,那么用 classpath: 前缀是找不到的,这种情况下就需要使用 classpath*: 前缀。 5. 在多个 classpath 中存在同名资源,都需要加载时,那么用 classpath: 只会...
- **示例配置**:根据给定的部分内容,`JAVA_HOME`的值被设置为`C:\Program Files\Java\jdk1.6.0_17`,这表示JDK 1.6.0_17版本安装在该路径下。 - **注意事项**: - 确保路径中的空格被转义或使用引号包围整个路径...
- 通常情况下,`.class` 文件需要放在 **classpath** 中定义的路径下,否则会因为找不到类文件而抛出 `ClassNotFoundException` 或 `NoClassDefFoundError` 异常。 #### 四、环境变量的验证 完成以上步骤后,可以...
对于`classpath*:`前缀的路径,Spring会搜索类路径下的所有匹配资源,而不仅仅是当前加载的类路径。 在`findPathMatchingResources`方法中,`determineRootDir`函数用于获取根目录路径,然后`subPattern`是相对于根...
如果类文件不在当前目录或其他已指定的路径下,JVM将无法找到并抛出异常。 验证这些环境变量设置是否正确,可以通过打开命令行(CMD)并输入`java -version`,若成功安装和配置,系统会显示Java版本信息。一旦这三...
1. **类搜索路径**:当执行Java程序时,如果没有指定类的完整路径,JVM会按照CLASSPATH中的路径来查找对应的类文件。默认情况下,`.`(当前目录)被包含在内,所以当前目录下的类文件会被找到。 2. **库引用**:...
当Java虚拟机(JVM)需要加载类库时,它会在`Classpath`变量指定的路径中查找所需的类文件。如果没有正确设置`Classpath`,可能会导致程序找不到所需的类文件而无法运行。 **2. 配置方法** 为了确保JVM可以找到...
- **全局访问**: 设置后,可以在任意目录下直接使用`java`、`javac`等命令,而不需要指定完整的路径。 - **提高效率**: 通过这种方式,可以快速调用JDK提供的各种工具,提高了开发效率。 #### 四、`classpath`环境...
Java 程序运行时,需要加载各种类文件和资源文件,`CLASSPATH` 设置了这些文件的搜索路径。 - **用途**: - 通过设置 `CLASSPATH`,可以确保 Java 虚拟机能够找到所需的类文件。例如,如果有一个外部库或 JAR 文件...
将`%JAVA_HOME%\bin`添加到PATH变量中,允许用户在任意目录下直接运行`javac`和`java`命令,而无需提供完整的路径。 **CLASSPATH**环境变量是用来指示Java虚拟机(JVM)在何处寻找类文件的。在早期的Java版本中,常常...
`.classpath` 和 `.project` 文件是Eclipse项目的配置文件,它们记录了项目类路径和项目信息,与Android Studio项目结构略有不同。`AndroidManifest.xml` 文件是Android应用的核心配置文件,包含了应用的基本信息、...
避免用户通过URL直接访问服务器上的任意文件,可以通过限制可下载的文件路径,或者使用相对路径而非绝对路径来防止路径遍历攻击。 6. **HTTP响应头**:除了MIME类型外,还需要设置HTTP响应头的一些属性,比如`...
- `.classpath`:这是Eclipse项目的一个配置文件,记录了项目的类路径信息,包括JRE系统库、项目依赖的库等。 - `.project`:这是Eclipse项目的元数据文件,包含了项目的构建配置信息。 - `project.properties`:...
执行一个可执行文件时,如果该文件不能在当前路径下找到,则依次寻找`PATH`中的每一个路径,直至找到。Java的编译命令(`javac`)、执行命令(`java`)和一些工具命令(`javadoc`, `jdb`等)都在其安装路径下的`bin`目录中...
在本地运行此代码可以成功,但在jar包环境下,由于文件路径不再是标准的文件系统路径,而是`jar:file:/…!/BOOT-INF/classes!/…`这样的形式,导致`FileNotFoundException`的抛出。 为了解决这个问题,我们需要利用...
- **PATH**: 控制可执行文件的搜索路径,Java的编译和运行命令都在其安装路径下的bin目录中,因此需要添加到PATH中。 - **CLASSPATH**: 用于查找运行Java程序所需的类库,可以包含路径和.jar文件。 6. **Linux...
如果class路径(classpath)配置正确,Java运行时环境将能够找到并加载相应的类文件。 关于通配符的使用,星号(*)通常用于表示任意长度的字符串,问号(?)用于匹配任意单个字符。方括号内的字符表示字符集,比如...
- **PATH**: 用于指定系统搜索可执行文件的路径列表,使得用户可以在任意路径下使用Java相关的命令。 - **CLASSPATH**: 用于指定Java类库或依赖包的位置,是Java虚拟机加载类的路径。 #### Windows环境下的配置步骤...
4. **处理".dll"文件**:在Windows环境下,需要将"jpcap.dll"复制到系统的PATH环境变量所包含的任意一个目录下,或者与你的Java应用程序在同一目录下,这样Java虚拟机才能找到并加载这个库。 5. **编写代码**:现在...
- **Path**:使系统能够在任何路径下识别Java命令。 - 变量值示例:`%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin` - **系统变量**: - **Classpath**:Java加载类(class或lib)的路径。 - 变量值示例:`.;%JAVA_HOME%\...