membaca file lengkap tanpa menggunakan loop di java


103

Kemungkinan Duplikat:
Cara membuat String Java dari konten file
Seluruh file teks menjadi String di Java

Saya mencoba membaca konten file menggunakan FileReader. Tetapi saya ingin membaca file tanpa membaca baris demi baris. Apakah mungkin untuk membaca seluruh file tanpa loop. Saya menggunakan kode berikut

 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();
 }

Kode ini tidak dapat dikompilasi untuk memulai.
Arya Pourtabatabaie

Ada solusi Java 11 satu baris untuk ini: stackoverflow.com/a/52301018/942774
Hendrik

Jawaban:


129

Jika filenya kecil , Anda dapat membaca seluruh data satu kali:

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
Tidak berfungsi untuk aset Android milik InputStream (tidak panjang)
akauppi

10
Seberapa kecil "kecil"?
perak

8
@silver Seluruh konten file akan disimpan di memori. Jadi, hindari membaca file 5GB seperti ini :-)
Thibaut D.

2
Catatan: file.length()mungkin mengembalikan 0 untuk file di bawah /proc. Dan dalam kasus tersebut cuplikan ini akan mengembalikan string kosong.
Mygod

1
readMungkin juga tidak memenuhi seluruh buffer. Ini mungkin berfungsi dalam praktik dengan sebagian besar JRE, tetapi tidak ada jaminan di API.
Daniel Lubarov

179

Solusi satu baris Java 7

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

atau

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

1
Tidak dapat menemukan File itu di Android.
akauppi

23
Tidak semua jawaban Java harus disesuaikan dengan Android, @akauppi! Cari saja solusi yang didukung Android dari jawaban lain!
Isaac Woods

String text = Files.readString(Paths.get("file"));bahkan lebih pendek lagi, dengan asumsi Anda menginginkan keluaran UTF-8 String.
Eagterrian Knight

Dan jika Anda sudah memiliki objek File, Anda dapat melakukannya file.toPath()di dalamreadAllBytes
Kartik Chugh

Penting untuk Android: Call requires API level 26: java.nio.file.Files#readAllBytes- hal yang sama untuk readString.
Nef

33

Anda dapat mencoba menggunakan Scanner jika Anda menggunakan JDK5 atau lebih tinggi.

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

Atau bisa juga menggunakan Jambu Biji

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

4
Perhatikan bahwa pemindai harus ditutup setelah digunakan.
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. Hanya salah ketik kecil. :-)
pisaruk

1
Kode ini dengan Scannerhanya membaca 1024 byte pertama dari file. Lihat kode sumber. Itu membaca buffer dan memeriksanya dengan regexp ini. Ini selalu valid - kemudian mengembalikan semua konten buffer. Secara default buffer memiliki ukuran 1024 byte.
Enyby

2
Ini adalah pendekatan yang BURUK. Solusi yang tepat (untuk Java 1.7 dan yang lebih tinggi) adalah Files.readAllLines(). Untuk JRE lama, FileInputStream.read()mungkin yang terbaik. Saya tidak yakin apakah ini portabel untuk semua platform (mis. Ctl-Z dikenali di mana-mana), dan mudah untuk melewatkan melakukan a Scanner.close().
paulsm4

33

Jika Anda menggunakan Java 5/6, Anda dapat menggunakan Apache Commons IO untuk membaca file ke string. Kelas berisi org.apache.commons.io.FileUtilsbeberapa metode untuk membaca file.

misalnya menggunakan metode FileUtils#readFileToString:

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

1
Ini mungkin solusi termudah menggunakan lib pihak ketiga.
perak

3
Kode minimal untuk ditulis; Lebih banyak perpustakaan untuk ditambahkan ke proyek.
Please_Dont_Bully_Me_SO_Lords

2
Metode readFileToString (File) dari jenis FileUtils tidak digunakan lagi
JavaSheriff

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.