Как считать строки из файла java
Чтение строк из файла в Java можно выполнить с помощью класса BufferedReader , который позволяет читать текстовые данные из потока ввода. Для чтения строк из файла сначала необходимо открыть файл для чтения, а затем читать строки по одной до тех пор, пока не достигнут конец файла.
Ниже приведен пример кода, который демонстрирует, как считывать строки из файла в Java с помощью BufferedReader :
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class Main public static void main(String[] args) try BufferedReader reader = new BufferedReader(new FileReader("file.txt")); String line = reader.readLine(); while (line != null) System.out.println(line); line = reader.readLine(); > reader.close(); > catch (IOException e) e.printStackTrace(); > > >
- В этом примере мы создаем объект BufferedReader с помощью конструктора new BufferedReader(new FileReader(«file.txt»)) , где file.txt — это имя файла, который мы хотим прочитать.
- Затем мы читаем строки из файла, вызывая метод readLine() объекта BufferedReader . Метод readLine() возвращает очередную строку текста из файла или null , если достигнут конец файла.
Кроме того, обратите внимание, что мы заключили вызов BufferedReader.close() в блок finally , чтобы гарантировать, что поток чтения будет закрыт даже в случае исключения.
Как считать строки из файла java
Хотя с помощью ранее рассмотренных классов можно записывать текст в файлы, однако они предназначены прежде всего для работы с бинарными потоками данных, и их возможностей для полноценной работы с текстовыми файлами недостаточно. И для этой цели служат совсем другие классы, которые являются наследниками абстрактных классов Reader и Writer .
Запись файлов. Класс FileWriter
Класс FileWriter является производным от класса Writer. Он используется для записи текстовых файлов.
Чтобы создать объект FileWriter, можно использовать один из следующих конструкторов:
FileWriter(File file) FileWriter(File file, boolean append) FileWriter(FileDescriptor fd) FileWriter(String fileName) FileWriter(String fileName, boolean append)
Так, в конструктор передается либо путь к файлу в виде строки, либо объект File, который ссылается на конкретный текстовый файл. Параметр append указывает, должны ли данные дозаписываться в конец файла (если параметр равен true), либо файл должен перезаписываться.
Запишем в файл какой-нибудь текст:
import java.io.*; public class Program < public static void main(String[] args) < try(FileWriter writer = new FileWriter("notes3.txt", false)) < // запись всей строки String text = "Hello Gold!"; writer.write(text); // запись по символам writer.append('\n'); writer.append('E'); writer.flush(); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >
В конструкторе использовался параметр append со значением false — то есть файл будет перезаписываться. Затем с помощью методов, определенных в базовом классе Writer производится запись данных.
Чтение файлов. Класс FileReader
Класс FileReader наследуется от абстрактного класса Reader и предоставляет функциональность для чтения текстовых файлов.
Для создания объекта FileReader мы можем использовать один из его конструкторов:
FileReader(String fileName) FileReader(File file) FileReader(FileDescriptor fd)
А используя методы, определенные в базом классе Reader, произвести чтение файла:
import java.io.*; public class Program < public static void main(String[] args) < try(FileReader reader = new FileReader("notes3.txt")) < // читаем посимвольно int c; while((c=reader.read())!=-1)< System.out.print((char)c); >> catch(IOException ex) < System.out.println(ex.getMessage()); >> >
Также мы можем считывать в промежуточный буфер из массива символов:
import java.io.*; import java.util.Arrays; public class Program < public static void main(String[] args) < try(FileReader reader = new FileReader("notes3.txt")) < char[] buf = new char[256]; int c; while((c = reader.read(buf))>0) < if(c < 256)< buf = Arrays.copyOf(buf, c); >System.out.print(buf); > > catch(IOException ex) < System.out.println(ex.getMessage()); >> >
В данном случае считываем последовательно символы из файла в массив из 256 символов, пока не дойдем до конца файла в этом случае метод read возвратит число -1.
Поскольку считанная порция файла может быть меньше 256 символов (например, в файле всего 73 символа), и если количество считанных данных меньше размера буфера (256), то выполняем копирование массива с помощью метода Arrays.copy. То есть фактически обрезаем массив buf, оставляя в нем только те символы, которые считаны из файла.
Построчное чтение файла в Java
В данном мануале мы разберем разные способы построчного считывания содержимого файла с помощью Java. Это можно сделать с помощью следующих классов Java: java.io.BufferedReader, java.util.Scanner, Files.readAllLines() и java.io.RandomAccessFile.
Чтение файла с помощью BufferedReader
Читать файл построчно можно с помощью метода readLine() из java.io.BufferedReader. Этот метод возвращает null при достижении конца файла.
Пример считывания с помощью BufferedReader:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileLineByLineUsingBufferedReader < public static void main(String[] args) < BufferedReader reader; try < reader = new BufferedReader(new FileReader("sample.txt")); String line = reader.readLine(); while (line != null) < System.out.println(line); // read next line line = reader.readLine(); >reader.close(); > catch (IOException e) < e.printStackTrace(); >> >
Узнайте больше о BufferedReader в API Doc (Java SE 8).
Чтение файла с помощью Scanner
С помощью класса Scanner можно открыть файл, а затем построчно прочитать его содержимое.
Ниже приведен пример чтения файла с помощью Scanner:
package com.journaldev.readfileslinebyline; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class ReadFileLineByLineUsingScanner < public static void main(String[] args) < try < Scanner scanner = new Scanner(new File("sample.txt")); while (scanner.hasNextLine()) < System.out.println(scanner.nextLine()); >scanner.close(); > catch (FileNotFoundException e) < e.printStackTrace(); >> >
Рекомендуем узнать больше о Scanner в API Doc (Java SE 8).
Чтение файла с помощью java.nio.file.Files
java.nio.file.Files — это класс утилит, в котором есть разные полезные методы. С помощью метода readAllLines() можно прочитать все строки файла в виде списка.
Пример построчного чтения файла с помощью Files:
package com.journaldev.readfileslinebyline; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class ReadFileLineByLineUsingFiles < public static void main(String[] args) < try < List allLines = Files.readAllLines(Paths.get("sample.txt")); for (String line : allLines) < System.out.println(line); >> catch (IOException e) < e.printStackTrace(); >> >
Рекомендуем подробнее ознакомиться с Files в API Doc (Java SE 8).
Чтение файла с помощью RandomAccessFile
С помощью RandomAccessFile можно открыть файл в read mode, а затем с помощью метода readLine прочитать файл построчно.
Пример работы RandomAccessFile:
package com.journaldev.readfileslinebyline; import java.io.IOException; import java.io.RandomAccessFile; public class ReadFileLineByLineUsingRandomAccessFile < public static void main(String[] args) < try < RandomAccessFile file = new RandomAccessFile("sample.txt", "r"); String str; while ((str = file.readLine()) != null) < System.out.println(str); >file.close(); > catch (IOException e) < e.printStackTrace(); >> >
Узнайте больше о RandomAccessFile в API Doc (Java SE 8).
Заключение
В этом мануале мы разобрали разные способы построчного чтения содержимого файла с помощью Java.
Как прочитать файл txt на java
Есть однострочный txt файл. Как считать из файла одну строку и присвоить String переменной это значение?
Отслеживать
28.8k 12 12 золотых знаков 59 59 серебряных знаков 118 118 бронзовых знаков
задан 14 мар 2017 в 6:38
91 2 2 золотых знака 3 3 серебряных знака 11 11 бронзовых знаков
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Java8
Если тебе надо иммено первую строчку прочитать :
String fileName = "file.txt"; Optional line = Files.lines(Paths.get(fileName)).findFirst(); System.out.println(line.get());
Если надо прочитать весь файл:
String fileName = "file.txt"; String content = Files.lines(Paths.get(fileName)).reduce("", String::concat); System.out.println(content);
Отслеживать
ответ дан 14 мар 2017 в 7:13
Vladlen Gladis Vladlen Gladis
1,586 10 10 серебряных знаков 15 15 бронзовых знаков
лучше бы .findFirst().orElse(null);
14 мар 2017 в 7:15
или line.ifPresent(System.out::print); Все равно прийдеться проверять на наличие строки как не крути
14 мар 2017 в 7:24
Тогда и так тоже не плохо Files.lines(Paths.get(fileName)).forEach(System.out::println); для всех строк
14 мар 2017 в 7:25
2 способ- если надо считать весь файл — тогда в content будет весь файл, заключенный в одну строчку? А что с переносами на новую строчку и tab-ами? Они будут в виде системных символов в строке или проигнорируются?
16 мар 2017 в 20:38
Да, будет одна строка. Если надо сохранить переносимость строк то можно написать так .reduce(«»,(a,b) -> a + «\n» + b);
17 мар 2017 в 6:40
Есть несколько способов, можете выбрать любой, в зависимости от версии java.
-
Явно создать BufferedReader :
try (BufferedReader reader = new BufferedReader(new FileReader(fileName)))
try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName)))
try (Stream stream = Files.lines(Paths.get(fileName))) < Optionaloptional = stream.findFirst(); String value = optional.isPresent() ? optional.get() : null; >