Я пытаюсь прочитать текстовый файл, который установлен в системной переменной CLASSPATH. Не пользовательская переменная.
Я пытаюсь получить входной поток в файл, как показано ниже:
Поместите каталог file ( D:\myDir
) в CLASSPATH и попробуйте ниже:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");
Поместите полный путь к файлу ( D:\myDir\SomeTextFile.txt
) в CLASSPATH и попробуйте те же 3 строки кода выше.
Но, к сожалению, никто из них не работает, и я всегда null
вхожу в мой InputStream in
.
getResourceAsStream()
File.Separator
- потому что вы не запрашиваете файл , вы запрашиваете ресурс . Важно понимать, что используемая абстракция - это не файловая система.Class.getResourceAsStream
это действительно удобный метод для вызоваClassLoader.getResourceAsStream
, но с дополнительной функцией «относительных» ресурсов. Если вы указываете абсолютный ресурс, то любой вызов, использующий тот же загрузчик классов, будет делать то же самое.При использовании Spring Framework (в виде набора утилит или контейнера - вам не нужно использовать последнюю функциональность) вы можете легко использовать абстракцию Resource .
Через интерфейс Resource вы можете получить доступ к ресурсу как InputStream , URL , URI или File . Изменение типа ресурса, например, ресурса файловой системы, является простым вопросом изменения экземпляра.
источник
Вот как я читаю все строки текстового файла на моем пути к классам, используя Java 7 NIO:
NB это пример того, как это можно сделать. Вам придется вносить улучшения по мере необходимости. Этот пример будет работать только в том случае, если файл действительно присутствует в вашем пути к классам, в противном случае будет выдано исключение NullPointerException, когда getResource () вернет null и для него будет вызван .toURI ().
Кроме того, начиная с Java 7, одним удобным способом задания наборов символов является использование констант, определенных в
java.nio.charset.StandardCharsets
(они, в соответствии с их javadocs , «гарантированно будут доступны в каждой реализации платформы Java».).Следовательно, если вы знаете кодировку файла UTF-8, то укажите явно кодировку
StandardCharsets.UTF_8
источник
Spring
sStreamUtils.copyToString
.Пожалуйста, попробуй
Ваши попытки не сработали, потому что только загрузчик классов для ваших классов может загружаться из пути к классам. Вы использовали загрузчик классов для самой системы Java.
источник
Чтобы на самом деле прочитать содержимое файла, мне нравится использовать Commons IO + Spring Core. Предполагая Java 8:
В качестве альтернативы:
источник
Чтобы получить абсолютный путь к классу, попробуйте это:
источник
Каким-то образом лучший ответ не работает для меня. Мне нужно использовать немного другой код вместо этого.
Я надеюсь, что это поможет тем, кто сталкивается с той же проблемой.
источник
Если вы используете гуаву:
мы можем получить URL от CLASSPATH:
или InputStream:
источник
Чтобы прочитать содержимое файла в строку из
classpath
, вы можете использовать это:Примечание:
IOUtils
является частьюCommons IO
.Назовите это так:
источник
Вы говорите: «Я пытаюсь прочитать текстовый файл, заданный в системной переменной CLASSPATH». Я предполагаю, что это в Windows, и вы используете этот уродливый диалог для редактирования «Системных переменных».
Теперь вы запускаете свою Java-программу в консоли. И это не работает: консоль получает копию значений системных переменных один раз при запуске . Это означает, что любое изменение в диалоге впоследствии не имеет никакого эффекта.
Есть эти решения:
Запускать новую консоль после каждого изменения
Используйте
set CLASSPATH=...
в консоли, чтобы установить копию переменной в консоли, и когда ваш код заработает, вставьте последнее значение в диалоговое окно переменной.Поместите вызов Java в
.BAT
файл и дважды щелкните по нему. Это будет каждый раз создавать новую консоль (таким образом, копируя текущее значение системной переменной).ВНИМАНИЕ: Если у вас также есть переменная User,
CLASSPATH
она будет скрывать вашу системную переменную. Вот почему обычно лучше поместить вызов вашей Java-программы в.BAT
файл и указать там путь к классу (используяset CLASSPATH=
), а не полагаться на глобальную системную или пользовательскую переменную.Это также гарантирует, что вы можете иметь более одной Java-программы, работающей на вашем компьютере, поскольку они обязательно имеют разные пути к классам.
источник
Мой ответ не совсем то, что задают в вопросе. Скорее, я даю решение, как легко мы можем прочитать файл в наше Java-приложение из нашего пути к классам проекта.
Например, предположим, что имя файла конфигурации example.xml находится по следующему пути:
com.myproject.config.dev
и наш исполняемый файл класса Java находится по следующему пути: -
com.myproject.server.main
Теперь просто проверьте оба указанных выше пути, которые являются ближайшим общим каталогом / папкой, откуда вы можете получить доступ как к dev, так и к главному каталогу / папке (com.myproject.server.main - там, где существует исполняемый класс java нашего приложения) - Мы можем видеть что это папка / каталог myproject, которая является ближайшей общей папкой / папкой, откуда мы можем получить доступ к нашему файлу example.xml. Поэтому из исполняемого класса java, находящегося в папке / директории main, мы должны вернуться на два шага, как ../../, чтобы получить доступ к myproject . Теперь, следуя этому, посмотрим, как мы можем прочитать файл: -
источник
Если вы компилируете свой проект в jar-файл: вы можете поместить свой файл в resources / files / your_file.text или pdf;
и используйте этот код:
источник
Я использую сервер приложений webshpere, и мой веб-модуль построен на Spring MVC. Они
Test.properties
были расположены в папке ресурсов, я попытался загрузить эти файлы, используя следующее:this.getClass().getClassLoader().getResourceAsStream("Test.properties");
this.getClass().getResourceAsStream("/Test.properties");
Ни один из приведенных выше кодов не загружал файл.
Но с помощью приведенного ниже кода файл свойств был успешно загружен:
Thread.currentThread().getContextClassLoader().getResourceAsStream("Test.properties");
Спасибо пользователю "user1695166" .
источник
использование
org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));
источник
Сценарий:
1)
client-service-1.0-SNAPSHOT.jar
имеет зависимостьread-classpath-resource-1.0-SNAPSHOT.jar
2) мы хотим прочитать содержимое ресурсов пути к классам (
sample.txt
) изread-classpath-resource-1.0-SNAPSHOT.jar
throughclient-service-1.0-SNAPSHOT.jar
.3)
read-classpath-resource-1.0-SNAPSHOT.jar
имеетsrc/main/resources/sample.txt
1.
pom.xml
изread-classpath-resource-1.0-SNAPSHOT.jar
2.
ClassPathResourceReadTest.java
класс,read-classpath-resource-1.0-SNAPSHOT.jar
который загружает содержимое файла ресурсов пути к классу.3.
pom.xml
изclient-service-1.0-SNAPSHOT.jar
4.
AccessClassPathResource.java
создать экземплярClassPathResourceReadTest.java
класса, в котором он будет загружатьсяsample.txt
и печатать его содержимое.5. Запустите исполняемый флягу следующим образом:
источник
Не используйте метод getClassLoader () и используйте «/» перед именем файла. "/" очень важно
источник
/
имеет тот же эффект, что иgetClassLoader()
метод.источник
Вы должны поместить свою 'системную переменную' в путь к классам Java.
источник