使用 Java 在不同的计算机上获取资源

Use Java to get resource on diff computer

 private static final String FILE_PATH = "MessageCompare\src\main\resources\json\test.json";` 

 File file = new File(FILE_PATH);

 BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file.getAbsolutePath())));`

在我的电脑里,file.getAbsolutePath() return
D:\Dev\Tool\MessageCompare\MessageCompare\src\main\resources\json\test.json

在其他电脑上,file.getAbsolutePath() return
D:\Dev\Tool\MessageCompare\src\main\resources\json\test.json

为什么文件的绝对路径return比别人的电脑多一个节点?

出于这个原因,您不应该依赖文件的绝对路径,这完全取决于其他人是 运行 代码的位置。在您的情况下,还有一个额外的 MessageCompare 目录。

而是使用 class 加载程序加载文件:

MyClass.class.getResourceAsStream("/myFile.txt");

这样你的代码会更便携。

File file = new File(FILE_PATH);

这一行创建了一个文件。文件的路径取决于您的项目文件夹和设置。如果您的工作站包含另一个名为 "MessageCompare" 的文件夹,并且您的项目是在该文件夹中设置的,这可能是您获得额外节点的原因。

最好使用相对路径来保证跨平台

通常有两种获取资源的方式:

  1. getClass().getResourceAsStream()<非静态方法> & xxx.Class.getResourceAsStream()<静态方法>
  2. getClass().getClassLoader().getResourceAsStream()<非静态方法> & xxx.Class.getClassLoader().getResourceAsStream()<static方法>

有什么区别? Please notice this structure

  1. 关于#1,它使用: InputStream in = getClass().getResourceAsStream("/json/rti.json");
  2. 对于#2,它使用: InputStream in = getClass().getClassLoader().getResourceAsStream("json/rti.json");