Как получить массив строк с помощью Files.list()

У меня есть текстовый файл со строками.

Я хочу получить массив String, содержащий все строки из файла, с помощью метода Files.list(Paths.get("path")).

Я пытался использовать toArray(), но он возвращает массив пути для файлов в каталоге «путь».

Как я могу получить его с помощью Files.list(Paths.get("path")) (это обязательно)?

У меня есть что-то вроде этого:

public Object[] returnStrings(){
    Object[] strings;
    try {
        strings = Files.list(Paths.get(path)).toArray();
    }catch (IOException ex){
        return null;
    }
    return strings;
}

«Я хочу получить массив строк», содержащий что? Содержимое этого файла? Пожалуйста, редактировать свой вопрос, чтобы уточнить его. Также является ли Files.list(Paths.get("path")) обязательным? Files.readAllLines(filePath, charset) создаст List<String>, содержащий все строки из указанного файла, или, если вы действительно хотите создать String[] множество, вы можете использовать что-то вроде File.lines(filePath, charset).toArray(String[]::new).

Pshemo 19.03.2022 16:56

См. также stackoverflow.com/questions/34208962

Stephen C 20.03.2022 09:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Files.list() ожидает дорожка, указывающую на каталог в качестве параметра, и даст вам потокPath объектов (если есть), содержащихся в этом каталоге. В случае, если данный дорожка будет файл, вы получите исключение NotDirectoryException. Вы не можете получить доступ к содержимое файла с помощью Files.list(), он просто предназначен для другой цели.

Для читать из текстовый файл вы можете использовать либо Files.lines(), либо Files.readAllLines().

В отличие от Files.readAllLines(), который выгружает все содержимое файла в память, поток, созданный Files.lines(), будет заполняться лениво. Следовательно, в общем случае Files.lines() предпочтительный способ чтения из файла, особенно когда вы не знаете его размер.

Для этой задачи, несмотря на то, что все содержимое файла должно быть размещено в памяти (т.е. в данном случае упомянутое выше преимущество лени потока не имеет значения), лучше выбрать Files.lines(), поскольку ожидаемый результат должен быть массив строк. Генерация множество в результате выполнения потокового конвейера будет более производительной и более эффективной, чем чтение файла в список (который возвращает readAllLines()), а затем создание массива строк на основе этого списка.

С Files.lines() это можно было бы реализовать так:

public static String[] readFromFile(Path path) {
    String[] result;
    try(Stream<String> stream = Files.lines(path)) {
        result = stream.toArray(String[]::new);
    } catch (IOException e) {
        result = new String[0];
    }
    return result;
}

В вашем коде есть несколько важные вопросы:

  • Вы не закрываете ресурс. Поскольку поток обращается к файлу, он должен быть закрыт либо явно внутри блока finally, либо с помощью попробуй с ресурсами, как показано выше (что является предпочтительным и более кратким способом).
  • Хранить String в массиве Object не очень хорошая идея, потому что для того, чтобы делать что-либо с этими строками, кроме их печати, вам придется выполнять небезопасное приведение типов.
  • Не очень приятно возвращать null в случае, если попытка чтения из файла не удалась. Потому что null может вызвать проблему впоследствии, когда не будет очевидно, откуда она взялась.

И на последок несколько рекомендации:

  • Избегайте размещения оператора возврат внутри блоков try и catch, это снижает читабельность.
  • List является более удобным и гибким контейнером данных, чем массив. В тех случаях, когда вы не имеете дело с существующим кодом, который ожидает массив, используйте вместо этого List.

Другие вопросы по теме