Java读取相对路径文件是的前提也是相对的:文件必须位于classpath下面,否则随便一个相对文件是没法读取的。
用IDE创建一个工程,一般都会有一个src的目录,这个src就是工程的classpath目录了,只要在src目录或其子目录下的文件,在程序代码中都可以使用相对路径的方式来读取,这里的相对路径和文件系统的相对路径概念上也许有点差异。
举例来说:
public class TestRead {
public static String genWscmd(String xmlfilename) {
InputStream in = TestRead.class.getClassLoader().getResourceAsStream(xmlfilename);
String x = StringFileToolkit.file2String(in, "UTF-8");
return x;
}
public static void main(String[] args) {
String out = genWscmd("sys_ds.xml");
System.out.println(out);
}
}
1、sys_ds.xml位于src下,路径直接写其名字。但千万别写成“/sys_ds.xml”了,这是错误的,会被认为是绝对路径。
2、将文件sys_ds.xml移动到mypack包下面,则路径应该写为:mypack/sys_ds.xml,前面还是没有“/”,这点要注意。
3、必须通过ClassLoader来执行getResourceAsStream()方法。获取ClassLoader有两种方式:
InputStream in = TestRead.class.getClassLoader().getResourceAsStream(xmlfilename);
或
InputStream in = new TestRead().getClass().getClassLoader().getResourceAsStream(xmlfilename);
4、将一个流转换为字符串的实现如下:
/**
* 读取输入流为一个内存字符串,保持文件原有的换行格式
*
* @param in 输入流
* @param charset 文件字符集编码
* @return 文件内容的字符串
*/
public static String file2String(InputStream in, String charset) {
StringBuffer sb = new StringBuffer();
try {
LineNumberReader reader = new LineNumberReader(new BufferedReader(new InputStreamReader(in, charset)));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append(System.getProperty("line.separator"));
}
reader.close();
} catch (UnsupportedEncodingException e) {
log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + charset, e);
} catch (IOException e) {
log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!", e);
}
return sb.toString();
}
上面的执行结果是: