Существуют тонкие различия в том, как fileNameинтерпретируется передаваемый вами текст. В принципе, у вас есть 2 разные методы: ClassLoader.getResourceAsStream()иClass.getResourceAsStream() . Эти два метода будут определять местоположение ресурса по-разному.
В Class.getResourceAsStream(path), путь интерпретируется как локальный путь к пакету класса, из которого вы вызываете его. Например , призванию, String.getResourceAsStream("myfile.txt")будет искать файл в вашем пути к классам по следующему адресу: "java/lang/myfile.txt". Если ваш путь начинается с a /, то он будет считаться абсолютным путем и начнет поиск с корня пути к классам. Таким образом, вызов String.getResourceAsStream("/myfile.txt")будет смотреть на следующее место в вашем пути к классу ./myfile.txt.
ClassLoader.getResourceAsStream(path)будет считать все пути абсолютными. Так что вызов String.getClassLoader().getResourceAsStream("myfile.txt")и String.getClassLoader().getResourceAsStream("/myfile.txt")оба будут искать файл в вашем classpath в следующем месте:./myfile.txt .
Каждый раз, когда я упоминаю местоположение в этом посте, это может быть местоположение в самой вашей файловой системе или внутри соответствующего файла JAR, в зависимости от класса и / или ClassLoader, из которого вы загружаете ресурс.
В вашем случае вы загружаете класс с сервера приложений, поэтому вы должны использовать Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)вместо this.getClass().getClassLoader().getResourceAsStream(fileName). this.getClass().getResourceAsStream()тоже будет работать.
Прочтите эту статью для получения более подробной информации об этой конкретной проблеме.
Предупреждение для пользователей Tomcat 7 и ниже
Один из ответов на этот вопрос гласит, что мое объяснение кажется неправильным для Tomcat 7. Я попытался осмотреться, чтобы понять, почему это так.
Поэтому я посмотрел исходный код Tomcat WebAppClassLoaderдля нескольких версий Tomcat. Реализация findResource(String name)(которая в конечном итоге отвечает за создание URL-адреса запрашиваемого ресурса) практически идентична в Tomcat 6 и Tomcat 7, но отличается в Tomcat 8.
В версиях 6 и 7 реализация не пытается нормализовать имя ресурса. Это означает, что в этих версиях, classLoader.getResourceAsStream("/resource.txt")возможно, не будет получен тот же результат, что и у classLoader.getResourceAsStream("resource.txt")события, хотя это и должно быть (поскольку это то, что указывает Javadoc). [исходный код]
В версии 8 имя ресурса нормализовано, чтобы гарантировать, что используется абсолютная версия имени ресурса. Следовательно, в Tomcat 8 два вышеописанных вызова должны всегда возвращать один и тот же результат.[исходный код]
В результате вы должны быть особенно осторожны при использовании ClassLoader.getResourceAsStream()или Class.getResourceAsStream()в версиях Tomcat более ранних, чем 8. И вы также должны помнить, что на class.getResourceAsStream("/resource.txt")самом деле вызовы classLoader.getResourceAsStream("resource.txt")(ведущий /удаляется).
getClass().getResourceAsStream("/myfile.txt")ведет себя не такgetClassLoader().getResourceAsStream("/myfile.txt").