читать полный файл без использования цикла в java


103

Возможный дубликат:
как создать строку Java из содержимого файла
всего текстового файла в строку в Java

Я пытаюсь прочитать содержимое файла с помощью FileReader. Но я хочу читать файл, не читая строку за строкой. Можно ли читать весь файл без цикла. Я использую следующий код

 try
 {
     File ff=new File("abc.txt");
     FileReader fr=new FileReader(ff);

     String s;
     while(br.read()!=-1)
     {
          s=br.readLine();
     }
 }

 catch(Exception ex)
 {
     ex.printStackTrace();
 }

Этот код изначально не компилируется.
Арья Пуртабатабаи

Для этого есть однострочное решение Java 11: stackoverflow.com/a/52301018/942774
Хендрик,

Ответы:


130

Если файл небольшой , вы можете прочитать все данные один раз:

File file = new File("a.txt");
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();

String str = new String(data, "UTF-8");

4
Не работает для Android-ресурсов InputStream (без длины)
akauppi

10
Насколько маленькое «маленькое»?
серебро

8
@silver Все содержимое файла будет сохранено в памяти. Так что не читайте такие файлы размером 5 ГБ :-)
Тибо Д.

2
Примечание: file.length()может возвращать 0 для файлов ниже /proc. И в этих случаях этот фрагмент вернет пустую строку.
Mygod

1
Также readможет не заполнить весь буфер. На практике это может работать с большинством JRE, но в API нет гарантии.
Daniel Lubarov

179

Однострочное решение Java 7

List<String> lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8);

или

 String text = new String(Files.readAllBytes(Paths.get("file")), StandardCharsets.UTF_8);

1
Не могу найти файлы в Android.
akauppi

23
Не все ответы Java должны подходить для Android, @akauppi! Просто найдите решение, которое поддерживает Android, из другого ответа!
Исаак Вудс,

String text = Files.readString(Paths.get("file"));еще короче, если предположить, что вам нужен вывод строки UTF-8.
Eagterrian Knight

И если у вас уже есть объект File, вы можете сделать это file.toPath()внутриreadAllBytes
Kartik Chugh

Важно для Android: Call requires API level 26: java.nio.file.Files#readAllBytes- то же самое для readString.
Неф,

33

Вы можете попробовать использовать Scanner, если используете JDK5 или выше.

Scanner scan = new Scanner(file);  
scan.useDelimiter("\\Z");  
String content = scan.next(); 

Или вы также можете использовать Guava

String data = Files.toString(new File("path.txt"), Charsets.UTF8);

4
Обратите внимание, что после использования сканер следует закрыть.
Barry NL,

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. Просто небольшая опечатка. :-)
pisaruk

1
Этот код Scannerчитает только первые 1024 байта из файла. Посмотрите исходный код. Он читает буфер и проверяет его с помощью этого регулярного выражения. Это всегда верно - тогда возвращается все содержимое буфера. По умолчанию буфер имеет размер 1024 байта.
Enyby 01

2
Это ПЛОХОЙ подход. Правильное решение (для Java 1.7 и выше) - Files.readAllLines(). Для устаревших JRE, FileInputStream.read()вероятно, лучше всего. Я не уверен, что он переносится на все платформы (т. Е. Ctl-Z распознается везде), и легко упустить возможность выполнить a Scanner.close().
paulsm4 02

33

Если вы используете Java 5/6, вы можете использовать Apache Commons IO для чтения файла в строку. Класс org.apache.commons.io.FileUtilsсодержит несколько методов чтения файлов.

например, используя метод FileUtils#readFileToString:

File file = new File("abc.txt");
String content = FileUtils.readFileToString(file);

1
Это, наверное, самое простое решение с использованием сторонней библиотеки.
серебро

3
Минимальный код для написания; Еще много библиотек для добавления в проект.
Please_Dont_Bully_Me_SO_Lords

2
Метод readFileToString (File) из типа FileUtils устарел
JavaSheriff

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.