java'da döngü kullanmadan dosyanın tamamını okuyun


103

Olası Çoğaltma:
Java'da bir Tam metin dosyasının içeriğinden bir Dizeye Java Dizesi nasıl oluşturulur

FileReader kullanarak bir dosyanın içeriğini okumaya çalışıyorum. Ama dosyayı satır satır okumadan okumak istiyorum. Döngü olmadan tüm dosyayı okumak mümkün mü? Aşağıdaki kodu kullanıyorum

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

Bu kod başlamak için derlenmeyecek.
Arya Pourtabatabaie

Bunun için tek satırlık bir Java 11 çözümü var: stackoverflow.com/a/52301018/942774
Hendrik

Yanıtlar:


130

Dosya küçükse , tüm verileri bir kez okuyabilirsiniz:

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'in Android varlıkları için çalışmıyor (uzunluk yok)
akauppi

10
"Küçük" ne kadar küçük?
gümüş

8
@silver Dosyanın tüm içeriği bellekte saklanacaktır. Bu nedenle, bunun gibi 5 GB'lık dosyaları okumaktan kaçının :-)
Thibaut D.

2
Not: file.length()altındaki dosyalar için 0 döndürebilir /proc. Ve bu durumlarda bu pasaj, boş bir dize döndürecektir.
Tanrım

1
Ayrıca readarabelleğin tamamını doldurmayabilir. Pratikte çoğu JRE ile çalışabilir, ancak API'de garanti yoktur.
Daniel Lubarov

179

Java 7 tek satır çözümü

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

veya

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

1
Bu Dosyaları Android'de bulamıyorum.
akauppi

23
Tüm Java yanıtlarının Android için uygun olması gerekmez, @akauppi! Android'in başka bir cevaptan desteklediği bir çözüm arayın!
Isaac Woods

String text = Files.readString(Paths.get("file"));UTF-8 Dize çıktısı istediğiniz varsayıldığında daha da kısadır.
Eagterrian Şövalye

Halihazırda File nesnesine sahipseniz, file.toPath()içeriden yapabilirsinizreadAllBytes
Kartik Chugh

Android için önemli: Call requires API level 26: java.nio.file.Files#readAllBytes- aynı şey için readString.
nef

33

JDK5 veya üstünü kullanıyorsanız Tarayıcıyı kullanmayı deneyebilirsiniz.

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

Veya Guava'yı da kullanabilirsiniz

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

4
Tarayıcının kullanımdan sonra kapatılması gerektiğini unutmayın.
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. Sadece küçük bir yazım hatası. :-)
pisaruk

1
ScannerDosyadan sadece ilk 1024 baytı okuyan bu kod . Kaynak koduna bakın. Arabelleği okur ve bu normal ifadeyle kontrol eder. Bu her zaman geçerlidir - daha sonra tüm tampon içeriğini döndürür. Varsayılan olarak arabelleğin boyutu 1024 bayttır.
Enyby

2
Bu KÖTÜ yaklaşımdır. Doğru çözüm (Java 1.7 ve üstü için) Files.readAllLines(). Eski JRE'ler FileInputStream.read()için muhtemelen en iyisidir. Tüm platformlar için taşınabilir olup olmadığından emin değilim (yani, Ctl-Z her yerde tanınır) ve a Scanner.close().
paulsm4

33

Java 5/6 kullanıyorsanız, dosyayı dizeye okumak için Apache Commons IO'yu kullanabilirsiniz . Sınıf, org.apache.commons.io.FileUtilsdosyaları okumak için birkaç yöntem içerir.

örneğin yöntemi kullanarak FileUtils#readFileToString:

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

1
Bu muhtemelen üçüncü taraf kitaplığı kullanan en kolay çözümdür.
gümüş

3
Yazılacak minimum kod; Projeye eklenecek çok daha fazla kitaplık.
Please_Dont_Bully_Me_SO_Lords

2
FileUtils türündeki readFileToString (File) yöntemi kullanımdan kaldırıldı
JavaSheriff

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.