GetResourceAsStream() возвращает значение null. Файл свойств не загружается
Я пытаюсь загрузить файл свойств. Вот моя структура
![Directory Structure]()
Теперь я пытаюсь загрузить файл test.properties. Но я получаю null. Вот как я делаю
public class Test {
String workingDir = System.getProperty("user.dir");
System.out.println("Current working directory : " + workingDir);
File temp = new File(workingDir + "\\" + "test.properties");
String absolutePath = temp.getAbsolutePath();
System.out.println("File path : " + absolutePath);
Properties properties = null;
try {
properties = new Properties();
InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream(absolutePath);
if (resourceAsStream != null) {
properties.load(resourceAsStream);
}
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
} //end of class Test
Эта программа печатает
Current working directory : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration
File path : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties
Но это не загрузка файлов свойств с этого пути. Хотя он присутствует там. Почему я получаю null?
Спасибо
Изменить ---
----------------------------
String workingDir = System.getProperty("user.dir");
System.out.println("Current working directory : " + workingDir);
File temp = new File(workingDir, "test.properties");
String absolutePath = temp.getAbsolutePath();
System.out.println("File path : " + absolutePath);
try {
properties = new Properties();
InputStream resourceAsStream = new FileInputStream(temp);
if (resourceAsStream != null) {
properties.load(resourceAsStream);
}
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
Current working directory : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration
File path : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties
java.io.FileNotFoundException: D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at com.softech.ls360.integration.BatchImport.main(BatchImport.java:57)
Ответы
Ответ 1
О, о... Здесь есть несколько проблем:
1) В вашем первом предоставленном фрагменте кода вы используете ClassLoader
для загрузки файла ресурсов. Это действительно хорошее решение. Но для метода getResourceAsStream
требуется относительное имя класса. Вы предоставляете абсолютный путь.
2) Второй фрагмент кода (после редактирования) приводит к невозможности найти файл "D:...\LS360BatchImportIntegration\test.properties". Согласно вашему снимку экрана, файл должен быть "D:...\LS360AutomatedRegulatorsReportingService\test.properties". Это другой каталог.
Я боюсь, что ваши описания не соответствуют последним на вашей машине.
Но позвольте просто перейти к разумному решению:
1) В вашем проекте Eclipse (скриншот говорит нам, что вы используете Eclipse), создайте новый каталог с именем "resources" на той же глубине, что и ваш каталог "src". Скопировать или лучше переместить - файл свойств в него.
2) Этот новый каталог должен быть помещен в "путь сборки". Щелкните правой кнопкой мыши каталог в окне "Проводник пакетов" или "Проводник проекта", выберите "Путь сборки", затем "Использовать в качестве исходной папки". Примечание. Этот путь сборки будет путь класса для проекта при его запуске.
3) Поскольку каталог ресурсов теперь является частью вашего пути к классу и содержит ваш файл свойств, вы можете просто загрузить его с помощью getResourceAsStream("test.properties")
.
ИЗМЕНИТЬ
Я просто вижу, что вы также используете Maven (файл pom.xml). В Maven такой каталог ресурсов существует по умолчанию и является частью пути сборки. Это "src/main/resources". Если это так, просто используйте это.
Ответ 2
Вы используете загрузчик классов (который читает в пути к классам), в то время как вы используете абсолютный путь.
Просто попробуйте:
InputStream resourceAsStream = new FileInputStream(temp);
В качестве побочного примечания попробуйте ввести в действие свой файл:
File temp = new File(workingDir, "test.properties");
чтобы использовать зависящий от системы пусковой механизм.
Ответ 3
Поместите свой файл свойств в папку /src/main/resources и загрузите с ClassLoader. Это будет исправлено.
как
/src/main/resources/test.properties
Properties properties = null;
try {
properties = new Properties();
InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("test.properties");
if (resourceAsStream != null) {
properties.load(resourceAsStream);
}
} catch (IOException e) {
e.printStackTrace();
}
Ответ 4
Вы передаете путь к файлу getResourceAsStream(String name)
, но name
вот путь к классу, а не путь к файлу...
Вы можете убедиться, что файл находится в вашем пути к классу или вместо него использовать FileInputStream
.
Ответ 5
У меня была аналогичная проблема с файлом, который не найден getResourceAsStream()
. Файл находился в папке ресурсов (src/main/resources
) и до сих пор не найден.
Проблема решена, когда я зашел в Eclipse Package Explorer и "обновил" папку ресурсов. Он был в каталоге, но Eclipse не видел его, пока папка не была обновлена (щелкните правой кнопкой мыши по папке и выберите "Обновить" ).