эквивалентно Files.readAllLines () для InputStream или Reader?

20

У меня есть файл, который я читал в List с помощью следующего метода:

List<String> doc = java.nio.file.Files.readAllLines(new File("/path/to/src/resources/citylist.csv").toPath(), StandardCharsets.UTF_8);

Есть ли какой-нибудь хороший (однострочный) Java 7/8 / nio2 способ реализовать тот же навык с файлом, который находится внутри исполняемого Jar (и, по-видимому, его нужно читать с помощью InputStream)? Возможно, способ открыть InputStream через загрузчик классов, а затем каким-то образом принудить / преобразовать / обернуть его в объект Path? Или какой-то новый подкласс InputStream или Reader, который содержит эквивалент File.readAllLines (...)?

Я знаю, что я мог сделать это традиционным способом на половинной странице кода или через некоторую внешнюю библиотеку ... но прежде чем это сделать, я хочу убедиться, что последние выпуски Java могут «Я уже делаю это« из коробки ».

    
задан Bitbang3r 26.03.2015 в 16:25
источник
  • Почему бы вам не хотеть остаться с вашим текущим решением? –  Loki 26.03.2015 в 16:31
  • Текущее решение работает только до тех пор, пока приложение работает внутри IntelliJ и на моем собственном компьютере. Это работает сегодня, но в конечном итоге он должен иметь возможность запускать исполняемый Jarfile. –  Bitbang3r 26.03.2015 в 16:36

2 ответа

36

An InputStream представляет поток байтов. Эти байты не обязательно образуют (текстовое) содержимое, которое можно читать по строкам.

Если вы знаете, что InputStream можно интерпретировать как текст, вы можете обернуть его в InputStreamReader и использовать BufferedReader#lines() , чтобы потреблять его по строкам.

try (InputStream resource = Example.class.getResourceAsStream("resource")) {
  List<String> doc =
      new BufferedReader(new InputStreamReader(resource,
          StandardCharsets.UTF_8)).lines().collect(Collectors.toList());
}
    
ответ дан Sotirios Delimanolis 26.03.2015 в 16:31
источник
  • Концепции «строк» ​​для InputStream нет, в ней используются только байты. Только у читателей есть строки. –  Louis Wasserman 27.03.2015 в 07:06
12

Вы можете использовать Apache Commons IOUtils # readLines :

List<String> doc = IOUtils.readLines(inputStream, StandardCharsets.UTF_8);     

ответ дан splintor 22.02.2016 в 10:25
источник