java和class放在不同目录_关于Java对相对目录的文件读写和调用方法的一些总结...

[ java project环境,使用java.io用相对路径读取文件的例子: *目录结构:  DecisionTree            |___src                 |___com.decisiontree.SamplesReader.java

关于Java对相对目录的文件读写和调用方法的一些总结

首先要讲Java路径

Java中使用的路径,分为两种:绝对路径和相对路径。具体而言,又分为四种:

1.本地系统的绝对路径:

如:  windows: C:\abc\ projectName\bin\def. properties

Linux:  /us/home/name/projectName/bin/def.properties

Java.io包中的类,需要使用这种形式的参数。但是,它们一般也提供了URI类型的参数,而URI类型的参数,接受的是URI样式的String。因此,通过URI转换,还是可以把URI样式的绝对路径用在java.io包中的类中。

2.URI形式的绝对资源路径

如:file:/C:/abc/def.properties

URL是URI的特例。URL的前缀/协议,必须是Java熟悉的。URL可以打开资源,而URI则不行。URL和URI对象可以互相转换,使用各自的toURI(),toURL()方法即可!

3.相对于classpath的相对路径

如:相对于file:/C:/abc/projectName/bin/def. properties/ 这个路径的相对路径。其中,bin是本项目的classpath。所有的Java源文件编译后的.class文件复制到这个目录中。还要知道src是java文件的目录,一般的IDE会将src里面的文件都编译放到指定的目录,默认就是项目的bin目录下

4.相对于当前用户目录的相对路径

就是相对于System.getProperty("user.dir")返回的路径。

对于一般项目,这是项目的根路径。对于JavaEE服务器,这可能是服务器的某个路径。这个并没有统一的规范!所以,绝对不要使用"相对于当前用户目录的相对路径"。然而默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。这就是说,在使用java.io包中的类时,最好不要使用相对路径。否则,虽然在J2SE应用程序中可能还算正常,但是到了J2EE程序中,一定会出问题!而且这个路径,在不同的服务器中都是不同的!

然后获取文件路径

说完了路径问题现在就要到了使用java类操作自己项目下的文件了进行操作,以properties文件为例,要学会变通。

那么我们现在来看一下可以使用那些类来获取到我们.java文件 ,或者叫 .class文件的目录了

现在你可以想象,我现在在哪个这个java类里面的代码,那我可以使用IO流把文件读取出来,那么就是利用我现在所在的这个类调用JDK里面的方法,来找出相对于我这个类的文件地址,它是这个类的同一个目录还是在项目的某个位置,如果不是相对的话,那么你就必须每次都需要修改代码来确定文件的位置,这是不明智的选择,所以还是利用相对路径来找到相对应的文件 :这里我要用到这3个类:

java.lang.System

java.lang.ClassLoader

java.lang.Class

1.      java.lang.System

方法: public static String getProperty(String key)

例如:System.getProperty("user.dir");

上面方法在JSE环境(JDK6.0_23)下使用运行结果是项目的文件夹的绝对路径;在web系统中就不能确定,好像网上说每个说法,建议少用,因为下面 的更好用。[用JAVA获取文件,我们应该尽量避免使用硬编码,即避免使用绝对路径,多用相对路径。举例来说  在本地读取可以 用 File file = new File(c:/test.txt)但是放到 linux中 就没

2.      java.lang.ClassLoader

方法1 :public URL getResource(String name)

查询JDK可以知道ClassLoader使用的是 ClassLoader中的URL findResource(String name)方法来获得当前类.class的classpath的,所以要注意的就是传只name的时候你输入的是的路径是相对于classpath的,即:你的类才packet com下,你写name="def.properties"时候,ClassLoader会找classpath下的def.properties文件 ,而不会去找自己packet下的 com/def.properties文件,如果你想用ClassLoader来读取com/def.properties文件,那么你的name应该是name="com/def.properties",而不是name="/com/def.properties",如果写成name="/com/def.properties",那么将会错误,这个地方要注意的,为什么就要自己看文档了,我也有点糊涂,但你说为什么有些地方写成"/com/def.properties",那是因为调用的是ClassLoader中的public static URL getSystemResource(String name),这个下面会讲到,如果还是要问这个不行,那你可以尝试两个方法ClassLoader().getResource("/")和class.getResource("/"),前面的为空值,后面的就是classpath了,更多的还是自己去尝试。

讲了ClassLoader获取路径问题那么就该讲如果新建ClassLoader,

1.你可以直接使用ClassLoader,即ClassLoader.getResource("");

2.可以用当前的Class类来获得Test.class.getClassLoader().getResource("");Test就是当前的类

3.可以当前线程: Thread.currentThread().getContextClassLoader().getResource("")

上面3种方法都是获得classpath目录,想指定文件直接相对与classpath来进行修改字符串,注意上面提到的路径问题

方法 2:public InputStream getResourceAsStream(String name)

路径解释和获得方法都一样,但是返回值是一个InputStream这个在文件操作中比较常用

3.      java.lang.Class

方法1 :public URL getResource(String name)

这里主要解释的就是 Class虽然都是使用ClassLoader实现但是使用的方法不一样,查看JDK文档可以发现Class使用的是ClassLoader.getSystemResource(java.lang.String)方法实现,这就是Class类中传递String name的值存在差异了Class的getResource方法的name字符串如果如果以"/"起始那么就是代表classpath目录,如果没有"/"标志开头,那么就是相对于我当前这个类目录来和字符串拼接,这就是差别。

但是发现,如果你直接调用ClassLoader.getSystemResource(java.lang.String),也不能使用以"/"的标志,可能是 加载器和类的不同把吧,这个也是要注意的。

class的获取应该不用我说了吧。

方法 2:public InputStream getResourceAsStream(String name)

这个方法和上面的差不多,我也不多说了。

总结一下,文件相对路径的读取应该就这么多了,文件流都出来了,还有什么是不能解决的呢,如何对properties的读取这个就不教了,还是你们自己上网找资料吧。

上面所讲的JSE文件读取,到了JEE,WEB目录下文件上传,下载对文件操作读取还没讲到,到时后再上网差一下资料,总结一些和大家分享吧。

文章写的不好还希望各位见谅,有错的提醒我,让我也少走弯路。

《备注:个人参考了很多网上资料,那个是原版就不知道了,所以没有出处》

[MyEclipse配置特点MyEclipse的class文件所在的目录配置    相对路径解析----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------1.    MyEc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,我理解您的问题是如何在 Java调用其他 Java 文件并进行读写操作。下面是一个简单的示例: 假设有两个 Java 文件:Main.java 和 Utils.java。Main.java 中需要调用 Utils.java 中的方法,并进行文件读写操作。 首先,在 Main.java 中导入 Utils.java 文件: ```java import Utils.java; ``` 然后,可以在 Main.java 中创建 Utils 类对象,调用其中的方法,并进行文件读写操作: ```java public class Main { public static void main(String[] args) { // 创建 Utils 类对象 Utils utils = new Utils(); // 调用 Utils 中的方法 utils.someMethod(); // 进行文件读写操作 // 写文件 String content = "Hello, world!"; utils.writeToFile("test.txt", content); // 读文件 String readContent = utils.readFromFile("test.txt"); System.out.println(readContent); } } ``` 其中,Utils.java 中的代码可以是这样的: ```java import java.io.*; public class Utils { public void someMethod() { // 这里放需要调用方法的代码 } public void writeToFile(String fileName, String content) { try { FileWriter writer = new FileWriter(fileName); writer.write(content); writer.close(); } catch (IOException e) { e.printStackTrace(); } } public String readFromFile(String fileName) { StringBuilder content = new StringBuilder(); try { FileReader reader = new FileReader(fileName); int c; while ((c = reader.read()) != -1) { content.append((char) c); } reader.close(); } catch (IOException e) { e.printStackTrace(); } return content.toString(); } } ``` 上述代码演示了如何在 Java调用其他 Java 文件,并进行文件读写操作。希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值