Вы неправильно используете термин «classpath».Путь к классам - это список каталогов и / или файлов JAR, используемый для разрешения классов и ресурсов во время выполнения или при компиляции.
Правильный термин для \com\mypackage\configdir\myConfig.txt
- это ресурс . Можетбыть файлом, пока он находится в вашем исходном дереве, но если вы когда-нибудь попытаетесь упаковать вашу программу в файл jar, он будет находиться внутри архива jar и вообще не будет файлом, поэтому вы не можете прочитать его с помощью FileInputStream.
Ресурс читается с помощью метода getResourceAsStream , который специально предназначен для извлечения статических данных, связанных с приложением:
File configFile = new File(myConfigDirPath + "myConfig.txt");
try (InputStream is = new BufferedInputStream(
configFile.exists()
? new FileInputStream(configFile)
: MyApplication.class.getResourceAsStream(
configFile.toString().replace('\\', '/')))) {
// do something
}
Это можно сделать немного более понятным, переместивваша логика чтения конфигурации для отдельного частного метода:
File configFile = new File(myConfigDirPath + "myConfig.txt");
if (configFile.exists()) {
try (InputStream is = new BufferedInputStream(
new FileInputStream(configFile))) {
readConfigurationFrom(is);
}
} else {
String configResourcePath =
configFile.toString().replace('\\', '/')))) {
InputStream configResource =
MyApplication.class.getResourceAsStream(configResourcePath);
if (configResource == null) {
throw new ConfigurationException(
"Cannot find the file \"" + configFile + "\""
+ " or the resource \"" + configResourcePath + "\"");
}
try (InputStream is = new BufferedInputStream(configResource)) {
readConfigurationFrom(is);
}
}
Некоторые дополнительные примечания:
- Ресурс указывается в виде относительного URL, например
/com/mypackage/configdir/myConfig.txt
.URL-адреса всегда используют прямую косую черту (/
) на всех платформах. - Вы всегда должны читать файл или ресурс, используя BufferedInputStream (или BufferedReader).Это значительно быстрее, чем чтение отдельных байтов непосредственно из файла.