- Rukovodstvo
- статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
- Java: чтение файла в строку
- Введение В этом руководстве мы будем считывать файл в строку в Java. Есть несколько способов чтения текстового содержимого файла. Вот список всех классов и методов, которые мы рассмотрим: * Files.lines () * Files.readString () * Files.readAllBytes () * FileReader * BufferedReader * Scanner Files.lines () Класс Files содержит статические методы для работы с файлами и каталогами. Полезный метод — lines (), который возвращает поток строк: Stream . Из этого потока,
- Вступление
- Files.lines ()
- Files.readString ()
- Files.readAllBytes ()
- Сканер
- FileReader
- FileReader.read (char [])
- FileReader.read ()
- BufferedReader
- Заключение
- Filereader java read string
- Field Summary
- Fields declared in class java.io.Reader
- Constructor Summary
- Method Summary
- Methods declared in class java.io.InputStreamReader
- Methods declared in class java.io.Reader
- Methods declared in class java.lang.Object
- Constructor Detail
- FileReader
- FileReader
- FileReader
- FileReader
- FileReader
- Read a File to String in Java
Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Java: чтение файла в строку
Введение В этом руководстве мы будем считывать файл в строку в Java. Есть несколько способов чтения текстового содержимого файла. Вот список всех классов и методов, которые мы рассмотрим: * Files.lines () * Files.readString () * Files.readAllBytes () * FileReader * BufferedReader * Scanner Files.lines () Класс Files содержит статические методы для работы с файлами и каталогами. Полезный метод — lines (), который возвращает поток строк: Stream . Из этого потока,
Вступление
В этом руководстве мы будем читать файл в виде строки в Java. Есть несколько способов чтения текстового содержимого файла.
Вот список всех классов и методов, которые мы рассмотрим:
Files.lines ()
Класс Files содержит статические методы для работы с файлами и каталогами. Полезный метод — lines() который возвращает поток строк: Stream . Из этого потока можно получить строки, содержащиеся в файле.
Метод принимает Path к файлу, который мы хотели бы прочитать, с необязательной Charset . Мы будем использовать try-with-resources для автоматизации очистки и закрытия:
Path path = Paths.get("input.txt"); try (Stream stream = Files.lines(path, StandardCharsets.UTF_8)) < stream.forEach(System.out::println); >catch (IOException ex) < // Handle exception >
Поскольку метод возвращает Stream , мы используем его forEach() для перебора строк со ссылкой на метод для краткости.
Вместо печати каждой линии, StringBuilder может быть использован для добавления строк:
Path path = Paths.get("input.txt"); StringBuilder sb = new StringBuilder(); try (Stream stream = Files.lines(path)) < stream.forEach(s ->sb.append(s).append("\n")); > catch (IOException ex) < // Handle exception >String contents = sb.toString();
С помощью StringBuilder весь файл может быть представлен в одной String ( contents выше переменная содержимого). Перед выполнением таких итераций важно учитывать длину входного файла.
Если файл не слишком велик, можно поместить его в строку, однако, если его размер составляет сотни мегабайт, это не так разумно.
Files.readString ()
Начиная с Java 11, Files познакомил нас с readString() , который принимает Path к файлу, а также Charset .
В отличие от Files.lines() , он возвращает String напрямую, а не объект Stream
Path path = Paths.get("input.txt"); String contents = null; try < contents = Files.readString(path, StandardCharsets.ISO_8859_1); >catch (IOException ex) < // Handle exception >
Files.readAllBytes ()
Более низкоуровневый подход к чтению — это Files.readAllBytes() , который возвращает byte[] . Разработчик должен использовать эти байты
Этот метод также принимает Path к файлу, который мы хотим прочитать:
Path path = Paths.get("input.txt"); byte[] bytes = null; try < bytes = Files.readAllBytes(path); >catch (IOException ex) < // Handle exception >
Теперь bytes содержит всю информацию из файла input.txt Самый простой способ преобразовать его в String — поместить их в конструктор с необязательным Charset :
String str = new String(bytes, StandardCharsets.UTF_8);
Примечание. Такие решения, как чтение всех байтов, подходят только в случаях, когда мы имеем дело с небольшими размерами файлов. Это не способствует производительности и не имеет особого смысла хранить большие файлы в памяти программы.
Сканер
Scanner — особенно полезный класс для чтения контента из потоков. Поскольку он работает с абстрактными потоками, его также можно использовать для чтения строк. Scanner работает, разбивая ввод на токены, которые последовательно извлекаются из входного потока.
Поскольку мы работаем со строками, мы хотели бы использовать методы, возвращающие строки. Scanner имеет next() и nextLine() именно для этого. Оба метода возвращают объекты типа String . Первый используется для чтения произвольных строк, тогда как второй анализирует и возвращает целые строки.
Если каждая строка содержит нужное количество данных, то nextLine() — идеальный выбор. Если в файле есть важная информация, разбитая на более мелкие куски, но не обязательно строки (или файл содержит, скажем, одну строку), тогда next() может быть лучшим вариантом.
Scanner принимает множество объектов — Path , InputStream , File и т. Д. Мы будем использовать File :
File file = new File("input.txt"); Scanner sc = new Scanner(file); while(sc.hasNext())
Мы используем while цикл до тех пор , как sc имеет больше элементов. Если бы мы не проверили с помощью hasNext() , sc выдаст NoSuchElementexception если мы попытаемся получить доступ к элементу после последнего.
Идея использования hasNext() и next() исходит из Iterator , поскольку Scanner внутренне его реализует.
FileReader
FileReader используется для чтения файлов. Он предлагает read() и read(char[]) , которые возвращают один символ и несколько символов соответственно. Кроме того, он принимает в конструктор File или String .
FileReader.read (char [])
Откроем файл с помощью FileReader и прочитаем его содержимое:
FileReader in = new FileReader("input.txt"); char[] chars = new char[256]; int n = in.read(chars, 0, chars.length); String contents = new String(chars);
Метод read() принимает последовательность символов (в которой мы сохраняем прочитанные символы), начальную и конечную точки того, что мы хотим прочитать. В частности, мы решили читать не более 256 символов. Если в input.txt больше, мы прочитаем только 256 символов. Если его меньше, возвращаются читаемые символы.
Возвращаемое значение, хранящееся внутри целого числа n может использоваться для проверки того, сколько символов фактически прочитал метод. Если достигнут конец потока, метод возвращает -1 .
Поскольку метод заполняет char[] , мы можем преобразовать его в String . Аналогичный результат можно получить, используя String.valueOf(char[]) .
FileReader.read ()
Метод read() без char[] читает по одному символу за раз. Нам нужно перебрать содержимое и прочитать каждый символ самостоятельно:
FileReader in = new FileReader("input.txt"); StringBuilder sb = new StringBuilder(); while(in.read() != -1) < sb.append(in.read()); >String contents = sb.toString(); in.close();
Здесь мы проверяем, не является ли прочитанный символ -1 , что указывает на то, что символов для чтения не осталось. Если нет, мы append() его к StringBuilder и, наконец, преобразуем его в String .
Примечание. И read() и read(char[]) читают байты, преобразуют их в символы и возвращают их один за другим . Это неэффективно и по возможности должно выполняться с буферизацией .
BufferedReader
BufferedReader — это объект, предназначенный для чтения текста из потока ввода символов. Он буферизован, что означает, что он использует внутренний буфер для временного хранения. Как мы видели в предыдущем разделе, «обычные» Reader иногда могут быть неэффективными.
Рекомендуется обернуть любой потенциально дорогостоящий Reader в BufferedReader для повышения производительности, поскольку символы буферизации позволяют более эффективно читать вводимый текст.
Создадим экземпляр BufferedReader :
BufferedReader in = new BufferedReader(new FileReader("input.txt"));
На данный момент у нас есть буферный объект чтения, готовый читать содержимое из input.txt . В этом примере мы будем читать файл построчно, хотя BufferedReader поддерживает чтение отдельных символов по отдельности, а также нескольких символов в массив.
Давайте воспользуемся этим BufferedReader для чтения файла и сохранения его содержимого построчно в строку:
StringBuilder sb = new StringBuilder(); while(in.readLine != null) < sb.append(in.readLine()).append("\n"); >String contents = sb.toString(); in.close();
И снова мы используем StringBuilder для сбора всех строк. Чтобы отделить каждую строку, мы добавляем между ними \n Наконец, закрываем поток.
Заключение
В этой статье мы рассмотрели некоторые распространенные техники чтения файлов в строки в Java. Есть много вариантов, но большинство из них имеют схожий основной принцип: указать путь к файлу, прочитать содержимое в структуре данных (например, char[] или String); затем выполните некоторую заключительную обработку, чтобы соответствующим образом собрать все содержимое файла.
Мы рассмотрели метод File.lines() метод Files.readString() метод Files.readAllBytes() , а также классы Scanner , FileReader и BufferedReader
Licensed under CC BY-NC-SA 4.0
Filereader java read string
Reads text from character files using a default buffer size. Decoding from bytes to characters uses either a specified charset or the platform’s default charset. The FileReader is meant for reading streams of characters. For reading streams of raw bytes, consider using a FileInputStream .
Field Summary
Fields declared in class java.io.Reader
Constructor Summary
Method Summary
Methods declared in class java.io.InputStreamReader
Methods declared in class java.io.Reader
Methods declared in class java.lang.Object
Constructor Detail
FileReader
public FileReader(String fileName) throws FileNotFoundException
FileReader
public FileReader(File file) throws FileNotFoundException
FileReader
FileReader
public FileReader(String fileName, Charset charset) throws IOException
FileReader
public FileReader(File file, Charset charset) throws IOException
Report a bug or suggest an enhancement
For further API reference and developer documentation see the Java SE Documentation, which contains more detailed, developer-targeted descriptions with conceptual overviews, definitions of terms, workarounds, and working code examples.
Java is a trademark or registered trademark of Oracle and/or its affiliates in the US and other countries.
Copyright © 1993, 2023, Oracle and/or its affiliates, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
All rights reserved. Use is subject to license terms and the documentation redistribution policy.
Read a File to String in Java
Learn to read a text file into String in Java. Following examples use Files.readAllBytes() , Files.lines() (to read line by line) and FileReader and BufferedReader to read a file to String.
1. Using Files.readString() – Java 11
With the new method readString() introduced in Java 11, it takes only a single line to read a file’s content into String using the UTF-8 charset .
- In case of any error during the read operation, this method ensures that the file is properly closed.
- It throws OutOfMemoryError if the file is extremely large, for example, larger than 2GB .
Path filePath = Path.of("c:/temp/demo.txt"); String content = Files.readString(fileName);
2. Using Files.lines() – Java 8
The lines() method reads all lines from a file into a Stream. The Stream is populated lazily when the stream is consumed.
- Bytes from the file are decoded into characters using the specified charset.
- The returned stream contains a reference to an open file. The file is closed by closing the stream.
- The file contents should not be modified during the reading process, or else the result is undefined.
Path filePath = Path.of("c:/temp/demo.txt"); StringBuilder contentBuilder = new StringBuilder(); try (Stream stream = Files.lines(Paths.get(filePath), StandardCharsets.UTF_8)) < stream.forEach(s ->contentBuilder.append(s).append("\n")); > catch (IOException e) < //handle exception >String fileContent = contentBuilder.toString();
3. Using Files.readAllBytes() – Java 7
The readAllBytes() method reads all the bytes from a file into a byte[]. Do not use this method for reading large files.
This method ensures that the file is closed when all bytes have been read or an I/O error, or other runtime exception, is thrown. After reading all the bytes, we pass those bytes to String class constructor to create a new String.
Path filePath = Path.of("c:/temp/demo.txt"); String fileContent = ""; try < byte[] bytes = Files.readAllBytes(Paths.get(filePath)); fileContent = new String (bytes); >catch (IOException e) < //handle exception >
4. Using BufferedReader – Java 6
If you are still not using Java 7 or later, then use BufferedReader class. Its readLine() method reads the file one line at a time and returns the content .
Path filePath = Path.of("c:/temp/demo.txt"); String fileContent = ""; StringBuilder contentBuilder = new StringBuilder(); try (BufferedReader br = new BufferedReader(new FileReader(filePath))) < String sCurrentLine; while ((sCurrentLine = br.readLine()) != null) < contentBuilder.append(sCurrentLine).append("\n"); >> catch (IOException e) < e.printStackTrace(); >fileContent = contentBuilder.toString();
We can use the utility classes provided by the Apache Commons IO library. The FileUtils.readFileToString() is an excellent way to read a whole file into a String in a single statement.
File file = new File("c:/temp/demo.txt"); String content = FileUtils.readFileToString(file, "UTF-8");
Guava also provides Files class that can be used to read the file content in a single statement.
File file = new File("c:/temp/demo.txt"); String content = com.google.common.io.Files.asCharSource(file, Charsets.UTF_8).read();
Use any of the above-given methods for reading a file into a string using Java.