Discuss / Java / 奇葩想法

奇葩想法

Topic source
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");

  • 1

Reply