java project环境,使用java.io用相对路径读取文件的例子:
*目录结构:
DecisionTree
|___src
|___com.decisiontree.SamplesReader.java
|___resource
|___train.txt,test.txt
*SamplesReader.java:
String filepath="resource/train.txt";//注意filepath的内容;
File file=new File(filepath);
……
*我们留意filepath的内容,java.io默认定位到当前用户目录("user.dir")下,即:工程根目
录"D:\DecisionTree"下(注意区别:getResourceAsStream方法默认到当前类所在的目录——即包中),因此,此时的相对路径(以user.dir为基路径的路径)为"resource/train.txt"
。这样,JVM就可以根据"user.dir"与"resource/train.txt"得到完整的路径(即绝对路
径)"D:\DecisionTree\resource\train.txt",从来找到train.txt文件。
*注意:相对路径的起始处无斜杆"/";例如:
filepath="resource/train.txt";
而不是filepath="/resource/train.txt"; //error!
不管你是新手还是老鸟,在程序中读取资源文件总会遇到一些找不到文件的问题,这与Java底层的实现有关,不能算bug,只要方法得当,问题还是可以解决的。
项目的文件夹结构:
repathtest
├─src
│ └─com
│ └─lavasoft
│ ├─test
│ └─res
├─doc
├─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();
}
}
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
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());
}
}
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
/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下,这样就能保证在开发和发布时候均正常读取。
-----------------------
相关推荐
- 在Java中读取文件时,可以使用相对路径或绝对路径。如果文件在`src`目录下,且你的代码在同一目录层次,可以使用相对路径。否则,可能需要使用绝对路径,或者利用类路径的特性。 5. **使用`ClassLoader`读取资源...
当你在代码中使用相对路径时,Java会将这些路径与当前工作目录拼接,来找到实际的文件或目录。 Java中获取和设置当前工作目录的方法如下: ```java // 获取当前工作目录 File currentDir = new File("."); System....
2. 使用`Class.getResourceAsStream`(相对路径): ```java InputStream inputStream = Test.class.getResourceAsStream("abc.jpg"); ``` 3. 使用`ClassLoader.getResourceAsStream`: ```java InputStream ...
如果你想要从这个Java文件读取`yyy.properties`,假设它位于`src\env`目录,那么正确的相对路径应该是`./src/env/yyy.properties`。这里,`.`代表当前目录,也就是`src\come\home\basic`,然后你向这个目录添加相对...
- **相对路径**:如果文件位于Web应用的根目录下(如`yourwebapp\yourconfig\yourconf.properties`),可以使用`new FileInputStream("./yourconfig/yourconf.properties")`。 2. **Tomcat**: - 使用`System....
- 文件路径的处理:在不同环境下(如开发环境、测试环境、生产环境),资源文件的位置可能会变化,因此建议使用相对路径而不是绝对路径。 - 错误处理:在读取资源文件时,必须处理可能出现的异常,如文件未找到、...
1. **文件路径**:在Java中,文件路径可以是绝对路径,也可以是相对路径。理解这两种路径的区别对于正确地定位和打开文件至关重要。 2. **File类**:Java的`java.io.File`类是文件和目录路径名的抽象表示。通过File...
1. 相对类路径:如果你的Properties文件与Java源代码位于同一目录结构下,可以使用`getResourceAsStream()`方法,配合类路径来加载。例如: ```java InputStream in = getClass().getResourceAsStream("/config....
- **相对路径**:相对于当前工作目录或其他已知位置的路径。 示例: ```java File f1 = new File("d:\\test\\1.txt"); // 绝对路径 File f2 = new File("1.txt"); // 相对路径 File f3 = new File("e:\\abc...
相对路径更加灵活且适用于不同目录之间的文件引用,而绝对路径则更为稳定,适合于固定不变的文件结构。此外,在不同的编程环境中,路径的表示方法也有所差异,开发者需根据实际情况选择合适的路径类型。理解这些基本...
2. **获取JAR条目**:使用`JarFile`的`getEntry`方法,传入你想要访问的文件的相对路径。这将返回一个`JarEntry`对象,代表了JAR中的一个条目。 ```java JarEntry entry = jar.getEntry("relative_path_to_file"); ...
在 Java 中,可以使用 System.getProperty("user.dir") 来获取相对路径。该路径是相对于项目的根目录的。在 Web 项目中,该路径视不同的 Web 服务器不同而不同。 例如,在 Tomcat 中,该路径是相对于 Tomcat 安装...
本项目涉及的关键知识点主要包括文件写入、项目相对路径、Java反射以及模板数据写入。这些技术都是构建复杂应用时不可或缺的部分。 首先,我们要了解文件写入。在Java中,我们可以使用`java.io`包下的`FileWriter`...
如果没有斜杠,那么它被视为相对于调用类的包的相对路径。返回的是一个`InputStream`对象,你可以通过它来读取文件内容。 配置文件通常使用`.properties`格式,这是一种键值对的文本格式,用于存储配置信息。在Java...
- **相对路径**:相对于当前工作目录的路径。如果需要构建一个相对于某个已知File对象的路径,可以使用`File#relativize()`方法。 4. **路径解析**: 使用`File#getPath()`、`File#getName()`、`File#getParent()...
在 Java 项目中,获取相对路径可以使用 `getResource` 方法。这个方法可以返回当前类的相对路径。在静态方法中,可以使用 `Test.class.getResource("").getPath()`,而在非静态方法中,可以使用 `this.getClass()....
本文将深入探讨Java中的路径问题,包括绝对路径、相对路径、类加载器路径以及类路径的配置。 1. 绝对路径与相对路径 - **绝对路径**:是从根目录开始,完整指明文件或目录位置的路径。在Windows系统中,通常以驱动...
通常情况下,配置文件路径是一个相对路径,例如`"url.properties"`。 2. 配置文件的格式:配置文件的格式需要正确,否则将无法读取配置文件信息。通常情况下,配置文件格式是一个文本文件,例如`properties`文件。 3...
文件路径可以是相对路径(相对于当前工作目录)或绝对路径。确保路径正确无误,否则会抛出`FileNotFoundException`。 6. **性能优化** 除了使用`BufferedReader`提高读取性能外,还可以考虑使用`StringBuilder`或...
4. **相对路径与绝对路径**: 在指定资源路径时,可以使用相对路径(相对于当前类或指定类)或绝对路径(从根目录开始)。相对路径更灵活,但可能引起找不到资源的问题,因此需要确保路径的正确性。 5. **使用第三方...