package com.itranswarp.learnjava; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * Learn Java from https://www.liaoxuefeng.com/ * * @author liaoxuefeng * * getResourceAsStream("/default.properties") 中 "/default.properties" * 判断规则,它是固定格式,与.class文件中配置的路径不一样 以 / 开头快速,在 classpath中,查找到该文件 * String baseName = c.getPackageName(); * if (baseName != null && * !baseName.isEmpty()) { name = baseName.replace('.', '/') + "/" + * name; } */ public class Main2 { public static void main(String[] args) throws IOException { // 当报main错误的时候,要注意 Main2.class 的引用,是否和你当前的 类名是否一致 // .classpath 文件: https://blog.csdn.net/pengmm1990/article/details/68951389 // 即path=”src”表示文件夹src与.classpath在同一个目录, src表示 而不是/src它是以自己文件的位置作为起点,且代表源文件。 // <classpathentry kind="src" path="src"/> kind="src" 代表类型,数据来源, path="src" 代表该项目下的路径,src所在位置就是项目的根目录 // <classpathentry kind="output" path="bin"/> "output" 编译完输出到指定的目录, .class执行文件 try (InputStream input = Main2.class.getResourceAsStream("default.properties")) { System.out.print(input == null ? "not find" : input.toString()); } } }
1、添加到 classpath , classpath到底是啥子? 字母理解是: .class 文件 所在的目录, 也就是 .java文件编译后 生成的.class文件所在目录 当你编写一个大的java项目时,那么多.class文件,肯定要统一放到一个指定的目录如:pro/ bin/ 下面 源文件就放在pro/src/下面。 嗦嘎! pro/bin/ 这个就是“classpath”了!(bin文件夹里面存放编译过后的文件,一般是包名下的.class文件,如:com.launch.java > hello.class,各种配置文件) 为什么要把.class文件统一放大一个文件夹下? 你傻啊!,如果你到处放是不是操作起来很麻烦,不好查找和管控,所以一个项目一般只会存在一个 "classpath" 路径 IDE操作,全智能化编译指向 项目的bin文件夹; 如 eclipse: 【不同的IDE可能就不同了, 或自己写写玩都在同一个文件夹里了 "hello.java hello.class"】 D:. ├─bin │ └─com │ └─itranswarp │ └─learnjava .class 文件都在这 └─src ├─cc └─com └─itranswarp └─learnjava .java 文件都在这 2、配置文件我一定只能添加到"src"文件夹里面吗? 放在 com、learnjava文件夹下和.java文件一起不行吗?或者我想自己在src下面创建一个文件夹 cc 存放配置文件不可以吗??内心的小宇宙啊,就这样爆发了! 1、也可以!!哈哈! Main.class.getResourceAsStream("/default.properties") 里面的 路径就要改一下了 "/default.properties" 这个参数目录的起点就是 "classpath"(根目录,src文件夹下,如: / 代表 pro/bin/) 先看,这个方法处理的关键函数源代码: private String resolveName(String name) { if (!name.startsWith("/")) { // 如果不是 / 开头, 直接去当前文件包名下查找 该文件 Class<?> c = isArray() ? elementType() : this; String baseName = c.getPackageName(); // 包名 如: com.itranswarp.learnjava if (baseName != null && !baseName.isEmpty()) { //com/itranswarp/learnjava/default.properties 这就是要查找的目录 name = baseName.replace('.', '/') + "/" + name; } } else { name = name.substring(1); } return name; } 情况如下: 1 配置文件我一定只能添加到"src"文件夹里面,可以添加到项目以外的文件夹吗? 如果你要用此方法,必须是这样的,因为Eclipse每次运行时,会把src/下的源码 编译放到 bin/ 目录下 》 这就是 classpath 路径,这个方法是基于 classpath 运作的;想要读取项目以外的配置文件,可以用绝对路径搞定 new FileInputStream("D:\Users\test.txt"); 2、放在 com、learnjava文件夹下和.java文件一起不行吗? 可以! 第一种:如果在当前文件的完整的包名下( ..... com\itranswarp\learnjava),你直接可以这样 ,不用斜杆直接搜索文件名 Main.class.getResourceAsStream("default.properties"); 第二种:如果放在 “com/"这个下面,也就是包名 com.itranswarp.learnjava 中间,(哈哈,想法犀利!就是好玩),就需要这样: Main.class.getResourceAsStream("/com/default.properties"); 3、我想自己在src下面创建一个文件夹 cc 存放配置文件不可以吗?? 也行!(呃呃),这样改Main.class.getResourceAsStream("/cc/default.properties");
Sign in to make a reply
用户7570525982