在Java应用程序中,有时候需要在Jar包内部的代码中读取Jar包外部的文件。有很多小伙伴们在本地运行的时候都正常,但是部署到服务器上就各种读取文件失败,下面就介绍几种常见的方式,结合场景和代码进行详细说明,大家可以根据自己的场景使用合适的方式。
ClassLoader.getResourceAsStream()
方法允许从类路径下获取资源,包括Jar包外部的文件。
public class FileReader {
public String readExternalFile() {
try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("externalFile.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
StringBuilder content = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
return content.toString();
} catch (IOException e) {
e.printStackTrace();
return "Error reading external file";
}
}
}
使用绝对路径是一种直接的方式,但要确保文件路径是正确的,且相对路径是相对于执行Java命令的当前工作目录。
public class FileReader {
public String readExternalFile() {
String externalFilePath = "/path/to/externalFile.txt";
try (BufferedReader reader = new BufferedReader(new FileReader(externalFilePath))) {
StringBuilder content = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
return content.toString();
} catch (IOException e) {
e.printStackTrace();
return "Error reading external file";
}
}
}
通过URLClassLoader加载Jar包外部的文件,这样可以使用绝对路径或相对路径。
import java.net.URL;
import java.net.URLClassLoader;
public class FileReader {
public String readExternalFile() {
String externalFilePath = "/app/config/externalFile.txt";
try {
URL externalFileUrl = new URL("file:" + externalFilePath);
URLClassLoader classLoader = new URLClassLoader(new URL[]{externalFileUrl});
InputStream inputStream = classLoader.getResourceAsStream("externalFile.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder content = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
return content.toString();
} catch (IOException e) {
e.printStackTrace();
return "Error reading external file";
}
}
}
Spring框架提供了org.springframework.core.io.Resource
接口,通过org.springframework.core.io.DefaultResourceLoader
加载Jar包外部的文件。
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
public class FileReader {
public String readExternalFile() {
String externalFilePath = "/path/to/externalFile.txt";
DefaultResourceLoader resourceLoader = new DefaultResourceLoader();
Resource resource = resourceLoader.getResource("file:" + externalFilePath);
try (InputStream inputStream = resource.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
StringBuilder content = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
return content.toString();
} catch (IOException e) {
e.printStackTrace();
return "Error reading external file";
}
}
}
?
本文介绍了几种读取Jar包外部文件的常见方式,包括使用ClassLoader.getResourceAsStream()
、使用绝对路径、使用URLClassLoader、以及使用Spring框架的Resource。在选择使用哪种方式时,需要根据具体的场景和需求进行选择,确保代码的可维护性和可移植性。