Java中Project项目文件夹的绝对路径
这个主题有很多混乱。 有人问过几个问题。 事情似乎还不清楚。 ClassLoader,绝对文件路径等
假设我有一个项目目录结构,
我的项目 - --dist --lib --src - 测试
我在“lib / txt”目录中有一个资源说“txtfile.txt”。 我想以独立于系统的方式访问它。 我需要项目的绝对路径。 所以我可以将路径编码为abspath +“/ lib / Dictionary / txtfile.txt”
假设我这样做了
java.io.File file = new java.io.File(""); //Dummy file String abspath=file.getAbsolutePath();
我得到当前的工作目录,不一定是项目根目录。
假设我从’dist’文件夹执行最后的’prj.jar’,该文件夹也包含“lib / txt / txtfile.txt”目录结构和资源,它也应该在这里工作。 我应该是dist文件夹的绝对路径。
希望问题很清楚。
您应该使用类加载器来使用getResource()或getResourceAsStream()来进行此类操作。 特别是,这些方法使用ClassLoader来确定项目中资源的搜索上下文。
指定类似getClass().getResource("lib/txtfile.txt")
以获取文本文件。
澄清一下:不要考虑如何获取资源的路径,而应该考虑获取资源 – 在这种情况下是某个目录中的文件(可能在JAR中)。 在这种情况下,没有必要知道一些绝对路径,只有一些URL来获取文件,ClassLoader将为您返回此URL。 如果要打开文件流,可以直接执行此操作,而无需使用getResourceAsStream
来处理URL。
您尝试通过ClassLoader访问的资源需要位于Class-Path(在JAR文件的Manifest中配置)。 这很关键! ClassLoader使用Class-Path来查找资源,因此如果在类路径中没有提供足够的上下文,它将无法找到任何内容。 如果你添加.
ClassLoader应解决JAR内部或外部的任何问题,具体取决于您如何引用资源,尽管您当然可以更具体。
参考前缀为a的资源.
将导致ClassLoader也查找JAR之外的文件,而不为资源路径添加句点前缀将指示ClassLoader仅在JAR文件内查找。
这意味着如果你在一个名为foo.txt
的目录lib
的JAR中有一些文件,并且你想获得资源,那么你将运行getResource("lib/foo.txt");
如果相同的资源在JAR之外,则运行getResource("./lib/foo.txt");
首先,确保lib目录位于类路径中。 您可以通过在启动脚本中添加命令行参数来执行此操作:
$JAVA_HOME/bin/java -classpath .:lib com.example.MyMainClass
将其保存为MyProject / start.sh或任何os依赖脚本。
然后你可以访问textfile.txt(正如Mark正确提到的那样):
// if you want this as a File URL res = getClass().getClassLoader().getResource("text/textfile.txt"); File f = new File(res.getFile()); // As InputStream InputStream in = getClass().getClassLoader() .getResourceAsStream("text/textfile.txt");
@Mark是正确的。 这是迄今为止最简单,最强大的方法。
但是,如果你真的需要一个File
,那么最好的办法就是尝试以下方法:
- 将系统属性“java.class.path”的内容转换为路径名列表,
- 根据文件名识别列表中的JAR路径名,
- 弄清楚“../ ..”是什么相对于JAR路径名给你“项目”目录,和
- 构建相对于项目目录的目标路径。
另一种方法是将项目目录名称嵌入到包装器脚本中,并使用-D选项将其设置为系统属性。 也可以让包装器脚本找出自己的绝对路径名; 例如,使用。