不管你是新手还是老鸟,在程序中读取资源文件总会遇到一些找不到文件的问题,这与Java底层的实现有关,不能算bug,只要方法得当,问题还是可以解决的。
项目的文件夹结构:
repathtest
├─src
│ └─com
│ └─lavasoft
│ ├─test
│ └─res
├─doc
1、在Java开发工具的project中使用相对路径
在project中,相对路径的根目录是project的根文件夹,在此就是repathtest文件夹了。
创建文件的写法是:
File f = new File("src/com/lavasoft/res/a.txt");
File f = new File("doc/b.txt");
注意:
路径不以“/”开头;
脱离了IDE环境,这个写法就是错误的,也并非每个IDE都如此,但我见到的都是这样的。
2、通过CLASSPATH读取包内文件
读取包内文件,使用的路径一定是相对的classpath路径,比如a,位于包内,此时可以创建读取a的字节流:
InputStream in = ReadFile.class.getResourceAsStream("/com/lavasoft/res/a.txt");
有了字节流,就能读取到文件内容了。
注意:
这里必须以“/”开头;
3、看看完整的测试代码
package com.lavasoft.test;
import java.io.*;
/**
* Java读取相对路径的文件
*
* @author leizhimin 2010-1-15 10:59:43
*/
public class ReadFile {
public static void main(String[] args) {
readTextA_ByClassPath();
readTextA_ByProjectRelativePath();
readTextB_ByProjectRelativePath();
}
/**
* 通过工程相对路径读取(包内)文件,注意不以“/”开头
*/
public static void readTextA_ByProjectRelativePath() {
System.out.println("-----------------readTextA_ByProjectRelativePath---------------------");
File f = new File("src/com/lavasoft/res/a.txt");
String a = file2String(f, "GBK");
System.out.println(a);
}
/**
* 通过工程相对路径读取(包外)文件,注意不以“/”开头
*/
public static void readTextB_ByProjectRelativePath() {
System.out.println("-----------------readTextB_ByProjectRelativePath---------------------");
File f = new File("doc/b.txt");
String b = file2String(f, "GBK");
System.out.println(b);
}
/**
* 通过CLASSPATH读取包内文件,注意以“/”开头
*/
public static void readTextA_ByClassPath() {
System.out.println("-----------------readTextA_ByClassPath---------------------");
InputStream in = ReadFile.class.getResourceAsStream("/com/lavasoft/res/a.txt");
String a = stream2String(in, "GBK");
System.out.println(a);
}
/**
* 文件转换为字符串
*
* @param f 文件
* @param charset 文件的字符集
* @return 文件内容
*/
public static String file2String(File f, String charset) {
String result = null;
try {
result = stream2String(new FileInputStream(f), charset);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return result;
}
/**
* 文件转换为字符串
*
* @param in 字节流
* @param charset 文件的字符集
* @return 文件内容
*/
public static String stream2String(InputStream in, String charset) {
StringBuffer sb = new StringBuffer();
try {
Reader r = new InputStreamReader(in, charset);
int length = 0;
for (char[] c = new char[1024]; (length = r.read(c)) != -1;) {
sb.append(c, 0, length);
}
r.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
}
(代码写得粗糙,异常没做认真处理)
运行结果:
-----------------readTextA_ByClassPath---------------------
aaaaaaaaa
sssssssss
-----------------readTextA_ByProjectRelativePath---------------------
aaaaaaaaa
sssssssss
-----------------readTextB_ByProjectRelativePath---------------------
bbbbbbbbbbb
Process finished with exit code 0
这是通过IDEA开发工具运行的,结果没问题,如果换成控制台执行,那么使用了项目相对路径的读取方式会失败,原因是,此时已经脱离了项目的开发环境,-----这个问题常常困扰着一些菜鸟,代码在开发工具好好的,发布后执行就失败了!
下面我截个图:
5、获取CLASSPATH下文件的绝对路径
当使用相对路径写入文件时候,就需要用到绝对路径。下面是个例子:
package com.lavasoft;
import java.io.File;
/**
* CLASSPATH文件的绝对路径获取测试
*
* @author leizhimin 2010-1-18 9:33:02
*/
public class Test {
//classpath的文件路径
private static String cp = "/com/lavasoft/cfg/syscfg.properties";
public static void main(String[] args) {
//当前类的绝对路径
System.out.println(Test.class.getResource("/").getFile());
//指定CLASSPATH文件的绝对路径
System.out.println(Test.class.getResource(cp).getFile());
//指定CLASSPATH文件的绝对路径
File f = new File(Test.class.getResource(cp).getFile());
System.out.println(f.getPath());
}
}
输出:
/D:/projects/bbt/code/cdn/planrpt/out/production/planrpt/
/D:/projects/bbt/code/cdn/planrpt/out/production/planrpt/com/lavasoft/cfg/syscfg.properties
D:\projects\bbt\code\cdn\planrpt\out\production\planrpt\com\lavasoft\cfg\syscfg.properties
Process finished with exit code 0
总结
使用工程相对路径是靠不住的。
使用CLASSPATH路径是可靠的。
对于程序要读取的文件,尽可能放到CLASSPATH下,这样就能保证在开发和发布时候均正常读取。
分享到:
相关推荐
2. 使用`Class.getResourceAsStream`(相对路径): ```java InputStream inputStream = Test.class.getResourceAsStream("abc.jpg"); ``` 3. 使用`ClassLoader.getResourceAsStream`: ```java InputStream ...
本文将深入探讨Java中的相对路径,这是在处理文件和目录时经常会遇到的一个关键主题。相对路径是相对于当前工作目录或某个已知起点的文件或目录的路径表示方式,与绝对路径(完整描述文件或目录位置的路径)相比,...
在Java中,处理文件时通常会遇到两种类型的路径:**相对路径**与**绝对路径**。 - **相对路径**:指的是相对于当前工作目录或类路径(Classpath)的一种路径表示方式。 - **绝对路径**:则是一种完整地指明文件位置...
如果你想要从这个Java文件读取`yyy.properties`,假设它位于`src\env`目录,那么正确的相对路径应该是`./src/env/yyy.properties`。这里,`.`代表当前目录,也就是`src\come\home\basic`,然后你向这个目录添加相对...
该方法有两个参数,第一个参数是文件的相对路径,第二个参数是 Class 对象。相对路径可以是相对于当前类所在的包的路径,也可以是绝对路径。如果路径以 "/" 开头,则表示绝对路径,否则表示相对路径。 例如,...
Java文件路径操作是Java开发中常见且重要的任务,无论是在读写文件、处理资源还是进行系统交互时,都需要对文件路径进行操作。本篇将详细探讨Java中的文件路径处理技术,主要涵盖以下知识点: 1. **File类**: ...
- 在Java中读取文件时,可以使用相对路径或绝对路径。如果文件在`src`目录下,且你的代码在同一目录层次,可以使用相对路径。否则,可能需要使用绝对路径,或者利用类路径的特性。 5. **使用`ClassLoader`读取资源...
在Java Web开发中,理解和掌握相对路径与绝对路径的运用是至关重要的,因为这直接影响到资源定位、页面跳转以及文件读写等操作的正确性。以下是对Java Web中相对路径与绝对路径问题的深入总结: ### 一、路径概念与...
1. 相对类路径:如果你的Properties文件与Java源代码位于同一目录结构下,可以使用`getResourceAsStream()`方法,配合类路径来加载。例如: ```java InputStream in = getClass().getResourceAsStream("/config....
本项目涉及的关键知识点主要包括文件写入、项目相对路径、Java反射以及模板数据写入。这些技术都是构建复杂应用时不可或缺的部分。 首先,我们要了解文件写入。在Java中,我们可以使用`java.io`包下的`FileWriter`...
在Java中,文件路径可以是绝对路径或相对路径。绝对路径是从根目录开始的完整路径,它指明了文件的确切位置。相对路径则是相对于当前工作目录的路径,它的解析依赖于程序运行时的工作目录。在处理文件路径时,开发者...
解决这个问题的方法是确保路径的正确性,可以使用绝对路径或者相对路径,并且检查文件是否真的存在于该路径下。 接下来,我们讨论写入Properties文件的问题。写入过程基本如下: 1. 创建Properties对象(如果还...
在 Java 项目中,获取相对路径可以使用 `getResource` 方法。这个方法可以返回当前类的相对路径。在静态方法中,可以使用 `Test.class.getResource("").getPath()`,而在非静态方法中,可以使用 `this.getClass()....
相对路径和绝对路径的选择取决于你需要操作的文件或目录相对于何处。相对路径方便于在项目内部引用资源,而绝对路径则提供了明确的文件位置。在处理Web应用中的资源时,理解这两种路径的区别及其获取方法至关重要,...
4. **读取相对路径**: - 可以使用`getClass().getResourceAsStream(filePath)`,其中`filePath`可以是`"/filename"`,这里的 `/` 代表 Web 发布根路径下的 `WEB-INF/classes`。 5. **获取文件真实路径**: - ...
在Java编程中,读写文本文件(如`.txt`文件)是常见的操作,尤其是在处理配置文件时。配置文件通常以键值对(key-value pairs)的形式存储数据,便于程序访问和管理设置。以下是对这个主题的详细阐述: 1. **Java I...
在实际编程中,了解如何区分和处理路径和相对路径对于正确地读取、写入或操作文件至关重要。Java提供了丰富的API,如 `java.io.File` 类,可以帮助我们进行路径的解析、合并以及转换等操作。例如,`File....
- 文件路径的处理:在不同环境下(如开发环境、测试环境、生产环境),资源文件的位置可能会变化,因此建议使用相对路径而不是绝对路径。 - 错误处理:在读取资源文件时,必须处理可能出现的异常,如文件未找到、...
Java中使用的路径主要分为两类:绝对路径和相对路径。具体来说,这两种路径又有以下四种表现形式: 1. **URI形式的绝对资源路径**:例如 `file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b`。URL是URI的一个...
本文将深入探讨Java中的路径问题,包括绝对路径、相对路径、类加载器路径以及类路径的配置。 1. 绝对路径与相对路径 - **绝对路径**:是从根目录开始,完整指明文件或目录位置的路径。在Windows系统中,通常以驱动...