Очень часто во время работы с файлами нужно считать весь файл в строку Java. В этом случае мы можем воспользоваться различными способами, например, использовать Apache Commons IO
, BufferedReader
, Scanner
или класс Files
.
На примере ниже я покажу 4 способа считать файл в строку (объект String) на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
package ua.com.prologistic; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Scanner; import org.apache.commons.io.FileUtils; // в этом классе показаны разные способы скопировать содержимое файла в строку public class ReadFileToString { public static void main(String[] args) throws IOException { String fileName = "/Users/prologistic/source.txt"; // читаем файл с помощью Scanner String contents = readUsingScanner(fileName); // считываем содержимое файла с помощью Apache Commons IO contents = readUsingApacheCommonsIO(fileName); // читаем файл в строку с помощью класса Files contents = readUsingFiles(fileName); // считываем содержимое файла в String с помощью BufferedReader contents = readUsingBufferedReader(fileName); System.out.println(contents); System.out.println(contents.length()); } // считываем содержимое файла в String с помощью BufferedReader private static String readUsingBufferedReader(String fileName) throws IOException { BufferedReader reader = new BufferedReader( new FileReader (fileName)); String line = null; StringBuilder stringBuilder = new StringBuilder(); String ls = System.getProperty("line.separator"); while( ( line = reader.readLine() ) != null ) { stringBuilder.append( line ); stringBuilder.append( ls ); } stringBuilder.deleteCharAt(stringBuilder.length()-1); return stringBuilder.toString(); } // читаем файл в строку с помощью класса Files private static String readUsingFiles(String fileName) throws IOException { return new String(Files.readAllBytes(Paths.get(fileName))); } // считываем содержимое файла с помощью Apache Commons IO private static String readUsingApacheCommonsIO(String fileName) throws IOException { return FileUtils.readFileToString(new File(fileName), StandardCharsets.UTF_8); } // читаем файл с помощью Scanner private static String readUsingScanner(String fileName) throws IOException { Scanner scanner = new Scanner(Paths.get(fileName), StandardCharsets.UTF_8.name()); //здесь мы можем использовать разделитель, например: "\\A", "\\Z" или "\\z" String data = scanner.useDelimiter("\\A").next(); scanner.close(); return data; } } |
Вы можете использовать любой метод. Что вам кажется более удобным, то и используйте.
Если вы знаете какой-то более удобный способ читать файл в строку на Java, то поделитесь им в комментариях.
Все вместе налепил хрен разберешь. Код не копируется (и нафиг так делать?). Только геморроя людям больше. Тупой блог двумя словами.
Здравствуйте! Код копируется, запускается и работает как следует. Возможно, у вас проблема с отображением. Напишите, пожалуйста, какой браузер вы используете, чтобы исправить эту проблему если она не только у вас.
Всё копируется. Нашёл подходящий вариант считывания, спасибо.
адрес файла может забыл поменять?
Спасибо! Все по полочкам. Можешь объяснить логику примера со Scanner? По какому принципу работают эти разделители \A \Z \z в данном примере?
Это вроде относится к регулярным выражениям. Сам вот гуглю что это такое. Тоже интересно было бы узнать про этот способ подробнее.
thanks, everything works)
Если вводить с абзацами, то слова лепятся друг к другу, как это изсправить?
//здесь мы можем использовать разделитель, например: «\\A», «\\Z» или «\\z»
не понял логику этих разделителей. обьясни плиз.