java获取文件路径问题

不知道为啥,这个main方法能运行出来,但监听运行后为空

ParseObject.java

  //(1)保存java包名、类名
    private static List<String> javaPathList = new ArrayList<String>();
 
  public static void main(String[] args) {
        init();
    }

    public static void init(){
        System.out.println("----------(1)获取包名/类名------------");
        getJavaPath(new File("src/main/java"));
        System.out.println(javaPathList);
    }



    //1.获取所有java包名
    public static void getJavaPath(File file){

        if(file.isFile()){
            //是文件
           String path = file.getPath();
           path = path.replace("src\\main\\java\\", "");
           if(path.contains(".java")){
                path = path.replace(".java","").replace("\\",".");
                javaPathList.add(path);
           }

        }else{
            //是文件夹
            File[] files = file.listFiles();
            System.out.println("main函数运行存在,但监听却为空"+Arrays.toString(files));

            for (File f: files){
                //现在不确定是文件或文件夹
                getJavaPath(f);//递归
            }
        }

    }

使用main方法运行

img

监听类

public class InitListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("监视器初始化---开始");
        ParseObject.init();
        System.out.println("监视器初始化---结束");

    }

    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }

}

Tomcat运行

img

  1. 你的代码没问题,结果是争取的
  2. 问题的原因new File("src/main/java")表示【当前目录】+"src/main/java"
  3. 两个环境的当前目录是不一样的,你可以添加下面的代码看看
    System.out.println(new File(".").getAbsolutePath())
    
  4. 你在main方法执行。【当前目录】为你project的目录

    img

  5. 你在tomcat下执行【当前目录】为你的tomcat工作目录

    img

在main方法启动的时候,用"src/main/java"可以获取到路径
但是tomcat启动的话,用“"src/main/java"”是获取不到的

可以改为流的方式:

InputStream in = this.getClass().getResourceAsStream("/"); 
Properties properties = new Properties();
properties.load(in);
properties.getProperty("property_name");

Lz,我的硬盘有个src/test路径,你的硬盘一定有吗?
你在本地运行可以,是因为程序是相对于当前的本地来找你的路径的,但是tomcat,是相对于服务器当前的路径来找路径的。(一般是你的WEB-INF下的lib下对应jar的class所在的路径)
所以,你要么new File的时候使用绝对路径,即成c:\src\test之类的,要么就保证你的服务器路径下有存在你的file路径。(就你那个class所在的路径)

提供参考实例【(踩坑)Java项目用File读取文件时,获取文件路径问题(weblogic部署时classes目录为空,被打成jar包放在lib下)】,链接:https://blog.csdn.net/desmoker/article/details/125424059
【该博文以第一人的方式讲述了使用的是tomcat服务器,应用启动后一切正常;发布测试环境使用的是weblogic服务器,发现File类读取docx和ftl模板,无法找到文件,详细分析,代码注解清晰,并提出2种参考思路:
第一种:文件在resource资源目录下,以流的形式读取文件并在classes目录下创建该文件(第一次运行时创建),之后正常路径在classes中读取文件。如果你只想获取流,可以直接获取,我是因为必须用到File对象,所以需要创建文件。
第二种:(最后项目中用的这种方法)将文件放到webapp 目录下,可以直接获取文件路径。应该能对你有所帮助】

参考链接

java获取文件的路径问题_weixin_33907511的博客-CSDN博客 java获取文件的路径问题在java中读取读取文件,经常因为路径的问题找不到,此文用于记录如何定位文件的简单方法。本基于springboot做的测试,主要是构建工程方便,所用的方法都是JDK中的方法,主要测试有”/“和没有""的问题,以及getResourceAsStream(String string)和getResource(String string)的问题。1.项目结构解释一... https://blog.csdn.net/weixin_33907511/article/details/93544780?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166763849216800180698183%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166763849216800180698183&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduend~default-1-93544780-null-null.nonecase&utm_term=java%E8%8E%B7%E5%8F%96%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%E9%97%AE%E9%A2%98&spm=1018.2226.3001.4450

.java又不是能直接运行的,真实运行是先编译成.class文件,你应该看一下你编译之后的类路径

img

,你打成war图不一样哈
它肯定是获取不到那个路径的呀