Управление ресурсами является неотъемлемой частью процесса разработки. Файлы ресурсов, такие как файлы конфигурации, изображения и текстовые файлы, обычно размещаются в каталоге ресурсов проекта для удобства управления и доступа. Однако у новичков может возникнуть некоторая путаница в том, как правильно читать эти пути к файлам. В этой статье будут рассмотрены несколько распространенных методов чтения путей к файлам в каталоге ресурсов в Java, которые помогут разработчикам более эффективно управлять ресурсами проекта и обеспечивать надежность и удобство обслуживания приложений.
/**
* Чтение содержимого файла на основе пути к файлу
* @param fileInPath
* @throws IOException
*/
public static void getFileContent(Object fileInPath) throws IOException {
BufferedReader br = null;
if (fileInPath == null) {
return;
}
if (fileInPath instanceof String) {
br = new BufferedReader(new FileReader(new File((String) fileInPath)));
} else if (fileInPath instanceof InputStream) {
br = new BufferedReader(new InputStreamReader((InputStream) fileInPath));
}
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}
getResource("") здесь представляет собой пустую строку.
public void function1(String fileName) throws IOException {
String path = this.getClass().getClassLoader().getResource("").getPath();
//Обратите внимание, что getResource("") пуст
System.out.println(path);
String filePath = path + fileName;
System.out.println(filePath);
getFileContent(filePath);
}
Получите путь к файлу напрямую с помощью метода getResource(fileName). Если путь содержит китайские символы, используйте URLDecoder.decode для его декодирования.
/**
* Получите путь непосредственно через имя файла getPath
* @param fileName
* @throws IOException
*/
public void function2(String fileName) throws IOException {
String path = this.getClass().getClassLoader().getResource(fileName).getPath();//Обратите внимание, что getResource("") пуст
System.out.println(path);
String filePath = URLDecoder.decode(path, "UTF-8");//Если путь содержит китайский язык, это будет URLEncoder, поэтому его нужно декодировать здесь.
System.out.println(filePath);
getFileContent(filePath);
}
Для путей к файлам методы getFile и getPath имеют одинаковый эффект. Если это URL-путь, getPath — это путь с параметрами. Как показано ниже:
url.getFile()=/pub/files/foobar.txt?id=zhouzhou
url.getPath()=/pub/files/foobar.txt
Код для получения файла с помощью метода getFile() выглядит следующим образом:
/**
* Получите его напрямую через имя файла + getFile().
* @param fileName
* @throws IOException
*/
public void function3(String fileName) throws IOException {
String path = this.getClass().getClassLoader().getResource(fileName).getFile();//Обратите внимание, что getResource("") пуст
System.out.println(path);
String filePath = URLDecoder.decode(path, "UTF-8");//Если путь содержит китайский язык, это будет URLEncoder, поэтому его нужно декодировать здесь.
System.out.println(filePath);
getFileContent(filePath);
}
Все файлы в SpringBoot находятся в пакетах jar и не имеют реального пути, поэтому вы можете использовать следующий метод.
/**
* Непосредственно используйте метод getResourceAsStream для получения потока.
* Этот метод необходимо использовать в проекте Springboot, поскольку реального пути для хранения файла в пакете jar не существует.
* @param fileName
* @throws IOException
*/
public void function4(String fileName) throws IOException {
InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);
getFileContent(in);
}
Получите поток, используя метод getResourceAsStream.,Без использования getClassLoader вы можете использовать getResourceAsStream("/Configuration Test.txt"), чтобы получить его непосредственно из корневого пути ресурсов.,Все файлы в SpringBoot находятся в пакетах jar и не имеют реального пути, поэтому вы можете использовать следующий метод.
/**
* Непосредственно используйте метод getResourceAsStream для получения потока.
* Если вы не используете getClassLoader, вы можете использовать getResourceAsStream("/configuration test.txt"), чтобы получить его непосредственно из корневого пути ресурсов.
* @param fileName
* @throws IOException
*/
public void function5(String fileName) throws IOException {
InputStream in = this.getClass().getResourceAsStream("/" + fileName);
getFileContent(in);
}
/**
* Получено через класс ClassPathResource, рекомендуется для использования в SpringBoot.
* Этот метод необходимо использовать в проекте Springboot, поскольку реального пути для хранения файла в пакете jar не существует.
* @param fileName
* @throws IOException
*/
public void function6(String fileName) throws IOException {
ClassPathResource classPathResource = new ClassPathResource(fileName);
InputStream inputStream = classPathResource.getInputStream();
getFileContent(inputStream);
}
/**
* Получить местоположение файла в проекте по абсолютному пути (нельзя использовать на сервере)
* @param fileName
* @throws IOException
*/
public void function7(String fileName) throws IOException {
String rootPath = System.getProperty("user.dir");//E:\WorkSpace\Git\spring-framework-learning-example
String filePath = rootPath + "\\chapter-2-springmvc-quickstart\\src\\main\\resources\\"+fileName;
getFileContent(filePath);
}
/**
* Получить местоположение файла в проекте по абсолютному пути (нельзя использовать на сервере)
* @param fileName
* @throws IOException
*/
public void function8(String fileName) throws IOException {
//Параметр пуст
File directory = new File("");
//Канонический путь: getCanonicalPath() Метод возвращает абсолютный путь и будет ..\ 、.\ Такие символы анализируются
String rootCanonicalPath = directory.getCanonicalPath();
//Абсолютный путь: getAbsolutePath() Метод возвращает абсолютный путь к файлу. Если во время создания это полный путь, он возвращает полный путь. Если при создании это относительный путь, он возвращает путь к текущему каталогу. + структура File путь к объекту
String rootAbsolutePath =directory.getAbsolutePath();
System.out.println(rootCanonicalPath);
System.out.println(rootAbsolutePath);
String filePath = rootCanonicalPath + "\\chapter-2-springmvc-quickstart\\src\\main\\resources\\"+fileName;
getFileContent(filePath);
}
В основном путем установки переменных среды и размещения файлов в переменных среды принцип также состоит в том, чтобы получить их по абсолютным путям.
Установите переменную среды: TEST_ROOT=D:\WorkSpace\Git\spring-framework-learning-example.
System.getenv("TEST_ROOT");
System.getProperty("TEST_ROOT")
Установив переменные среды, а затем пройдя файл по абсолютному пути
/**
* Получить местоположение файла в проекте по абсолютному пути
* @param fileName
* @throws IOException
*/
public void function9(String fileName) throws IOException {
System.setProperty("TEST_ROOT","E:\\WorkSpace\\Git\\spring-framework-learning-example");
//Параметр пуст
String rootPath = System.getProperty("TEST_ROOT");
System.out.println(rootPath);
String filePath = rootPath + "\\chapter-2-springmvc-quickstart\\src\\main\\resources\\"+fileName;
getFileContent(filePath);
}