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选项将其设置为系统属性。 也可以让包装器脚本找出自己的绝对路径名; 例如,使用。