Почему в Java 7 нет файла Files.readAllLines(String path)?
Я пытаюсь выучить nio 2
пакет в Java 7, и я наткнулся на Files.readAllLines(Path p, Charset cs)
метод. Я нахожу это очень полезным, но я считаю, что должна быть версия без cs
параметр, как:
public static List<String> readAllLines(String path)
throws IOException
{ return readAllLines(Paths.get(path), Charset.defaultCharset());}
Я убедился, что большую часть времени метод будет вызываться с помощью Charset по умолчанию, так почему бы не использовать ярлык. Есть ли что-то, чего мне не хватает в кодировках, которые бы оправдывали отсутствие этого метода? Я очень удивлен, потому что у Scala есть эта опция:
Source.fromFile("fileName").getLines
так что я не понимаю, почему Java не должна. Есть мнения?
2 ответа
[...] в большинстве случаев метод будет вызываться с Charset по умолчанию,
На самом деле, нет. Большую часть времени он будет вызываться с кодировкой, в которой вы ожидаете, что файл будет закодирован. Обычно в эти дни это UTF-8:
Files.readAllLines("fileName", StandardCharsets.UTF_8)
Ваше приложение может быть выполнено на нескольких платформах и операционных системах, используя различную кодировку символов по умолчанию. Вы не хотите, чтобы ваше приложение сломалось только из-за этого.
Я думаю, что это хороший выбор, исправление неправильных решений из прошлого. Многие старые методы Java используют системную кодировку по умолчанию, вызывая несогласованное поведение или приложения, например, между Windows и Linux. Принудительный выбор кодировки символов просто делает ваше приложение более переносимым и безопасным.
Кстати, так как вы упоминаете io.Source
класс - обратите внимание, что он возвращает итератор вместо List<String>
как Files
класс делает. Преимущество: файл загружается лениво, а не все сразу ArrayList<String>
, Недостаток: вы должны закрыть исходный код вручную (чего вы не можете сделать в своем фрагменте кода).
Вы должны спросить дизайнеров, но очень вероятно, что они разделяют мое мнение о том, что чтение целых файлов в память не должно поощряться. Он не масштабируется и вносит ненужные затраты времени и пространства. Обработайте файл строкой за раз.