前言

今天帮畅宝检查Java,发现几个MacOS的文件转到Windows下IntellJ的几个问题。

遂记录一下。

正文

1. Project 里面没有src和bin

刚开始打开文件的时候,很奇怪,只有红框里面的文件,什么src,bin文件夹都是没有的。

1691660918172.png

于是乎想了半天检查到底是什么问题,发现是文件夹里里面的.DS_Store文件过多了,(因为在删除了全部的.DS_Store文件之后,Intell J可以的Project里面终于显示了src和bin了,可能之间的交互存在一些BUG。)

关于.DS_Store,参考来自《Mac 上的 .DS_Store 究竟是什么文件?如何删除?》:DS_Store,英文全称是 Desktop Services Store(桌面服务存储),开头的 DS 是 Desktop Services(桌面服务) 的缩写。它是一种由macOS系统自动创建的隐藏文件,存在于每一个用「访达」打开过的文件夹下面。DS_Store 文件的主要作用,是存储当前文件夹在桌面显示相关方面的一些自定义属性,包括文件图标的位置、文件夹上次打开时窗口的大小、展现形式和位置等。这有助于保留为特定文件夹配置的设置,例如,将桌面文件夹设置为查看按名称排序的图标,同时将下载文件夹配置为将文件显示为列表并按日期排序,最近修改的先显示。

2. Eclipse的class path配置错误

出于某种未知原因,Intell J无法正确识别并且配置项目,这一步还比较简单,自己对src文件夹按下快捷键SHIFT + CTRL + A 输入 Mark directory as ... 然后选择root就可以了,注意要选择unmarked root,generated root显示是无法更改的,(这两种随时都可以互相转换)。

image.png

然后Edit Configuration进行配置

image.png

3. config.properties (系统找不到指定的路径。)

然后一切配置好之后,发现系统一直报错,报错原因是... config.properties (系统找不到指定的路径。),发现给的报错路径是一个我见都没见过的路径,思索半天,网上也找不到答案,但是突然看到一篇关于getResourceAsStream用法的描述(参考来自《Java中getResourceAsStream的用法》),中写的默认则是从ClassPath根下获取,遂想到,可能是classpath没有正确配置,于是打开File | Project Settings | Compiler output,里面显示的就是那个我见都没见过的路径,将路径改为project下的bin文件夹。

image.png

成功。

image.png

4. Java中getResourceAsStream的用法

BTW,其实《Java中getResourceAsStream的用法》,这篇文章写的很好,于是搬过来一下,是关于不同函数路径读取的问题,只能说Standardardization的问题了这个,一个破函数要注意这么多的路径读取问题。

4.1 类型

首先,Java中的getResourceAsStream有以下几种:

  1. Class.getResourceAsStream(String path): path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
  2. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
  3. ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,当然这和具体的容器实现有关。
  4. Jsp下的application内置对象就是上面的ServletContext的一种实现。

4.2 用法

其次,getResourceAsStream 用法大致有以下几种:

  1. 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类me.class ,同时有资源文件myfile.xml。那么,应该有此代码: me.class.getResourceAsStream("myfile.xml");
  2. 在me.class目录的子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml。那么,应该有此代码:me.class.getResourceAsStream("file/myfile.xml");
  3. 不在me.class目录下,也不在子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml。那么,应该有此代码:me.class.getResourceAsStream("/com/x/file/myfile.xml");

总结一下,可能只是两种写法

  1. 前面有 “ / ” (“ / ”代表了工程的根目录,例如工程名叫做myproject,“ / ”代表了myproject ):me.class.getResourceAsStream("/com/x/file/myfile.xml");
  2. 前面没有 “ / ” (代表当前类的目录) :me.class.getResourceAsStream("myfile.xml");me.class.getResourceAsStream("file/myfile.xml");

总结

避坑避雷,Mark一下。 (●'◡'●)

  1. Project 没有 src和bin,大概率可能是文件夹结构的问题,或者遇事不决重启Intell J
  2. config.properties 找不到很有可能是路径没设置对,比如classpath

参考

[1] Mac 上的 .DS_Store 究竟是什么文件?如何删除?
[2] Java中getResourceAsStream的用法

Q.E.D.


立志做一个有趣的碳水化合物