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