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();
 }
Adesh singh
sumber
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");
imxylz.dll
sumber
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);
Evgeniy Dorofeev
sumber
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);
Jayamohan
sumber
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);
Paul Vargas
sumber
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