关于IntelliJ IDEA 中的文件路径

本文详细讲解了IntelliJ IDEA中的模块组织方式,源代码、资源文件、测试代码的放置规范,并介绍了如何正确引用文件路径,包括生产环境和测试环境的部署结构。理解这些对于跨平台部署和代码调试至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:IntelliJ IDEA 中的文件路径 - 知乎

IDEA 能以“模块”作为基本单位。如下所示,一个 Demo 项目下有 Module0、Module1 两个模块:

Demo
  |-- .idea
  |-- Module0
  |-- Module0

在每个模块下,至少包含一个 src 目录和一个 .iml 文件:

Module0 
  |-- src
  |-- Module0.iml

.iml 文件也可以替换为 .classpath 文件

所有的 java 源代码(.java 文件)都必须放在 src 目录下。之所以要放在 src 目录下,是因为 src 目录被标记为了 Sources。事实上:

  1. 源代码要放在标记为 Sources 的目录下;
  2. 源代码的资源文件要放在标记为 Resources 的目录下;
  3. 测试代码要放在标记为 Tests 的目录下;
  4. 测试代码的资源文件要放在标记为 Test Resources 的目录下。

编译后,.class 文件、资源文件等,都会被放到项目的 out 目录下。其中:

  1. 源代码及其资源文件,被放在 out/production/Module0 下(Module0 为模块名)(因此,资源文件直接放在源代码所在的目录下也是没问题的);
  2. 测试代码及其资源文件,被放在 out/test/Module0 下。
自己生成的 jar 包被放在 /out/artifacts/Module0_jar 下。

编译后的代码:

out 目录的设置:

假设在 src 目录下有一个文件 jdbc.properties,其内容如下:

driver = com.mysql.cj.jdbc.Driver

同时在 src 目录下有一个 Demo0.java,其内容如下:

import java.io.IOException;
import java.io.FileInputStream;
import java.util.Properties;

public class Demo0 {
    public static void main(String[] args) throws IOException {
        Properties props = new Properties();
        props.load(new FileInputStream("Module0/src/jdbc.properties"));  // 注意路径的写法
        String driver = props.getProperty("driver");
        System.out.println(driver);
    }
}

上述代码中,路径要从 Demo 项目的根目录开始写起。

查看根目录: System.out.println(System.getProperty("user.dir"));

事实上,当在 IDEA 中运行 java 程序时,就是在命令行中运行如下命令:

java -cp D:/……/Demo/out/production/Module0 Demo0
--cp 用于指定 .class 文件、.jar 文件所在的目录。

而且,IDEA 中命令行的当前工作目录就是项目的根目录。所以,路径才需要从项目根目录写起。

当你直接在 out/production/Module0 目录下执行 java Demo,肯定会出错,因为按之前的相对路径,已经找不到文件了。

由此可见,脱离了 IDEA,该程序就无法正常运行了。即使是打成 jar 包,照样报错。

解决方法:使用 Class 类的 getResourceAsStream() 方法。该方法会从 .class 文件所在的目录查找文件,而编译时,资源文件与 .class 文件会放在同一个目录,所以一定可以找到文件。

将 Demo0.java 修改为如下:

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        Properties props = new Properties();
        /* 改动起始位置 */
        InputStream rs = Demo1.class.getResourceAsStream("jdbc.properties");
        props.load(rs);
        /* 改动结束位置 */
        String driver = props.getProperty("driver");
        System.out.println(driver);
    }
}

getResourceAsStream() 更多详见:Java 获取资源文件的输入流 - 知乎 (zhihu.com)

其它

Maven 标准结构

Module0
  |-- src
    |-- main
      |-- java
      |-- resources
    |-- test
      |-- java
      |-- resources
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值