Чтение текстового файла, который является частью jar, который выполняется - PullRequest
0 голосов
/ 22 октября 2019

Достаточно просто, я пытаюсь прочитать текстовый файл, скомпилированный в выполняемом jar-файле.
, чтобы структура файла выглядела примерно так

test.jar

-main.class

-META.INF

- MAINFEST.MF

-списки

- readfrom.txt

Я посмотрел вокруг, увидел, что у кого-то была похожая проблема, Чтение файла в JAR с использованием Relative Path Я попытался это сделать, но получил ошибку. Вот то, что я адаптировал из него

 List<String> testList = new ArrayList<>();
 try {
                InputStream configStream = getClass().getResourceAsStream("lists\\readfrom.txt");
                BufferedReader configReader = new BufferedReader(new InputStreamReader(configStream, "UTF-8"));
                File file = new File(String.valueOf(configReader));
                Scanner scanner = new Scanner(file);
                while (scanner.hasNextLine()) {
                    testList.add(scanner.nextLine());
                }
                scanner.close();
            }

Я запустил это и получил ошибку

java.io.FileNotFoundException: java.io.BufferedReader@4cf57088 (The system cannot find the file specified)

Есть что-то, что я пропускаю или это неправильный подход?

Это то, что у меня есть до сих пор

List<String> testList = new ArrayList<>();
 try {
                //what ever needs to happen
                File file = new File(filepath);
                Scanner scanner = new Scanner(file);
                while (scanner.hasNextLine()) {
                    testList.add(scanner.nextLine());
                }
                scanner.close();
            }

Я просто хочу, чтобы это прочитало файл и добавило каждую строку как новый элемент в список.

1 Ответ

0 голосов
/ 22 октября 2019

String.valueOf(configReader) не делает то, что вы думаете, что делает. Он просто дает вам строковое представление объекта Reader для целей отладки, например, java.io.BufferedReader@4cf57088

Так как вы, похоже, хотите прочитать содержимое файла, используя Scanner, вы должны взглянуть на список конструкторов , доступных для класса Scanner.

Когда вы это сделаете, вы можете обнаружить, что Scanner(InputStream source, String charsetName) - лучший выбордля вас.

Примечание: Вы должны использовать try-with-resources.

Тогда ваш код станет:

List<String> testList = new ArrayList<>();
try (Scanner scanner = new Scanner(getClass().getResourceAsStream("lists\\readfrom.txt"), "UTF-8")) {
    while (scanner.hasNextLine()) {
        testList.add(scanner.nextLine());
    }
}

Однако, посколькувы только читаете строки, вы должны использовать BufferedReader вместо Scanner, потому что Scanner очень медленный.

List<String> testList = new ArrayList<>();
try (InputStream configStream = getClass().getResourceAsStream("lists\\readfrom.txt");
     BufferedReader configReader = new BufferedReader(new InputStreamReader(configStream, "UTF-8"))) {
    for (String line; (line = configReader.readLine()) != null; ) {
        testList.add(line);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...