2016-10-27 3 views
1

В настоящее время я изучаю Java. Меня интересует, как читать текстовые файлы наиболее эффективным способом. Я прочитал, что можно использовать объект Stream (это «объект» в этом контексте правильный?), Чтобы сделать это и уже сделал это. Я могу распечатать каждую строку из текстового документа, используя следующий код:Самый чистый способ читать текстовый файл и обрабатывать каждую строку

private static void ReadFile(String filePath) { 
    Stream<String> readFileStream = null; 
    try { 
     readFileStream = Files.lines(Paths.get(filePath)); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    readFileStream.forEach(System.out::println); 
} 

Я хотел бы сделать что-то, используя каждую строку. Например, я хотел бы добавить кучу имен в свой текстовый документ и распечатать Java «Hello, NAME» для каждого имени. Как мне это сделать? Как мне получить доступ к отдельной строке, нужно ли сначала помещать список в массив, чтобы перебирать его?

Правильно ли сказать, что мы создали объект Stream с именем readFileStream? Я хочу убедиться, что моя терминология правильная. Более того, почему мы добавляем после Stream? Я знаю, что <> используются для списков, но я не понимаю их в этом контексте.

Заранее спасибо.

+1

http://stackoverflow.com/a/13741943/5703530 Если я не ошибаюсь, вы не можете изменить файл во время его чтения. Вот пример того, как хранить строки и модифицировать их позже. И что касается этого «<>» взгляните на общие файлы https://docs.oracle.com/javase/tutorial/java/generics/types.html –

ответ

2

Это просто, чтобы получить доступ к линии по отдельности: вам просто нужно изложить это выражение: readFileStream.forEach(System.out::println);

И превратить его в нечто вроде:

readFileStream.forEach(line -> { 
      System.out.println(line.toUpperCase()); 
     }); 

На моей иллюстрации я переворачиваю каждую строку в верхний регистр. Вы можете делать все виды обработки, если у вас есть линия по отдельности.

+0

Большое спасибо, я пошел с твоим ответом! – Inialk

1

Это будет читать одну строку в то время

File file = new File("text.txt"); 

    try(BufferedReader br = new BufferedReader(new FileReader(file))){ 
     String line; 
     while((line = br.readLine())!=null){ 
      System.out.println(line); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

Я действительно хотел использовать Stream: D – Inialk

+0

FileReader расширяет InputStreamReader. Так что технически это будет поток –

0
Files.lines(Paths.get(filePath)) 
    .filter(line -> line.startsWith(“J“)) 
    .forEach(line -> System.out.printf(“Hello, %s%n“, line)); 

Итак, вы были почти там. Прочитайте потоки. Потоки - это одноименная итерация, поэтому переменная является излишней. Я добавил фильтрацию, но ее можно было сортировать и так далее.

0

Существует хорошая библиотека, предоставляемая Apache: commons-io. Последняя версия - 2.5.

Вот Maven зависимость для него:

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.5</version> 
</dependency> 

Эта библиотека имеет очень хорошие методы для чтения файлов.

Проверить этот метод:

List<String> listOfLines = FileUtils.readLines(file, encoding); 

Он считывает файл в список String.

Смежные вопросы