читати повний файл без використання циклу в 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();
 }

Цей код не буде компілюватися для початку.
Arya Pourtabatabaie

Для цього є
Хендрік,

Відповіді:


129

Якщо файл невеликий , ви можете прочитати всі дані один раз:

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
Не працює для активів InputStream для Android (немає довжини)
akauppi

10
Наскільки маленький "малий"?
срібло

8
@silver Весь вміст файлу зберігатиметься в пам'яті. Тож уникайте читання файлів 5 Гб на зразок цього :-)
Thibaut D.

2
Примітка: file.length()може повернути 0 для файлів під /proc. І в цих випадках цей фрагмент поверне порожній рядок.
Mygod

1
Також readможе не заповнити весь буфер. Це може працювати на практиці з більшістю JRE, але в API немає гарантії.
Даніель Любаров

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 String.
Егерський лицар

А якщо у вас вже є об’єкт File, ви можете зробити file.toPath()всерединіreadAllBytes
Kartik Chugh

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

33

Можна спробувати сканер, якщо ви використовуєте 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);. Просто невеликий друкарський помилок. :-)
пісарук

1
Цей код Scannerзчитується лише перші 1024 байти з файлу. Подивіться на вихідний код. Він читає буфер і перевіряє це за допомогою цього регулярного покажчика. Це завжди справедливо - тоді він повертає весь вміст буфера. За замовчуванням буфер має розмір 1024 байти.
Enyby

2
Це BAD підхід. Правильне рішення (для Java 1.7 і вище) є Files.readAllLines(). Щодо спадщини JRE, FileInputStream.read()мабуть, найкраще. Я не впевнений, чи він портативний для всіх платформ (тобто Ctl-Z впізнається скрізь), і це легко пропустити Scanner.close().
paulsm4

33

Якщо ви використовуєте Java 5/6, ви можете використовувати IO Apache Commons IO для зчитування файлу до рядка. Клас org.apache.commons.io.FileUtilscontais кілька методів для читання файлів.

наприклад, використовуючи метод 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.