Вопрос-ответ

How to read text file from classpath in Java?

Как прочитать текстовый файл из classpath в Java?

Я пытаюсь прочитать текстовый файл, который задан в системной переменной CLASSPATH. Не пользовательская переменная.

Я пытаюсь получить входной поток в файл, как показано ниже:

Поместите каталог файла (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.

Переведено автоматически
Ответ 1

С каталогом в classpath из класса, загруженного тем же classloader, вы должны иметь возможность использовать любой из:

// From ClassLoader, all paths are "absolute" already - there's no context
// from which they could be relative. Therefore you don't need a leading slash.
InputStream in = this.getClass().getClassLoader()
.getResourceAsStream("SomeTextFile.txt");
// From Class, the path is relative to the package of the class unless
// you include a leading slash, so if you don't want to use the current
// package, include a slash like this:
InputStream in = this.getClass().getResourceAsStream("/SomeTextFile.txt");

Если они не работают, это говорит о том, что что-то еще не так.

Итак, для примера возьмем этот код:

package dummy;

import java.io.*;

public class Test
{
public static void main(String[] args)
{
InputStream stream = Test.class.getResourceAsStream("/SomeTextFile.txt");
System.out.println(stream != null);
stream = Test.class.getClassLoader().getResourceAsStream("SomeTextFile.txt");
System.out.println(stream != null);
}
}

И эта структура каталогов:

code
dummy
Test.class
txt
SomeTextFile.txt

И затем (используя разделитель путей в Unix, поскольку я нахожусь в Linux):

java -classpath code:txt dummy.Test

Результаты:

true
true
Ответ 2

При использовании фреймворка Spring (либо как набора утилит, либо контейнера - вам не нужно использовать последнюю функциональность) вы можете легко использовать абстракцию ресурса.

Resource resource = new ClassPathResource("com/example/Foo.class");

Через интерфейс ресурса вы можете получить доступ к ресурсу как к входному потоку, URL, URI или файлу. Изменение типа ресурса, например, на ресурс файловой системы - это простой вопрос изменения экземпляра.

Ответ 3

Вот как я читаю все строки текстового файла в моем classpath, используя Java 7 NIO:

...
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;

...

Files.readAllLines(
Paths.get(this.getClass().getResource("res.txt").toURI()), Charset.defaultCharset());

ПРИМЕЧАНИЕ: это пример того, как это можно сделать. Вам придется вносить улучшения по мере необходимости. Этот пример будет работать, только если файл действительно присутствует в вашем classpath, в противном случае будет вызвано исключение NullPointerException, когда getResource() возвращает null и для него вызывается .toURI() .

Кроме того, начиная с Java 7, одним из удобных способов указания наборов символов является использование констант, определенных в java.nio.charset.StandardCharsets (согласно их javadocs, они "гарантированно доступны в каждой реализации платформы Java".).

Следовательно, если вы знаете, что кодировка файла UTF-8, то явно укажите кодировку StandardCharsets.UTF_8

Ответ 4

Пожалуйста, попробуйте

InputStream in = this.getClass().getResourceAsStream("/SomeTextFile.txt");

Ваши попытки не сработали, потому что только загрузчик классов для ваших классов может загружаться из classpath. Вы использовали загрузчик классов для самой системы Java.

java