czytaj cały plik bez używania pętli w java


103

Możliwy duplikat:
Jak utworzyć ciąg Java z zawartości pliku
Cały plik tekstowy do ciągu w języku Java

Próbuję odczytać zawartość pliku za pomocą FileReader. Ale chcę przeczytać plik bez czytania wiersz po wierszu. Czy można odczytać cały plik bez pętli. Używam następującego kodu

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

Ten kod nie będzie się kompilował od początku.
Arya Pourtabatabaie

Istnieje jednowierszowe rozwiązanie Java 11 na to: stackoverflow.com/a/52301018/942774
Hendrik

Odpowiedzi:


130

Jeśli plik jest mały , możesz raz odczytać całe dane:

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
Nie działa w przypadku zasobów InputStream na Androida (bez długości)
akauppi

10
Jak małe jest „małe”?
srebrny

8
@silver Cała zawartość pliku zostanie zapisana w pamięci. Unikaj więc czytania takich plików o pojemności 5 GB :-)
Thibaut D.

2
Uwaga: file.length()może zwrócić 0 dla plików w ramach /proc. W takich przypadkach ten fragment zwróci pusty ciąg.
Mygod

1
readMoże też nie wypełnić całego bufora. To może działać w praktyce z większością JRE, ale nie ma gwarancji w API.
Daniel Lubarov

179

Jedno liniowe rozwiązanie Java 7

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

lub

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

1
Nie mogę znaleźć tych plików w systemie Android.
akauppi

23
Nie wszystkie odpowiedzi dotyczące języka Java muszą być dostosowane do systemu Android, @akauppi! Po prostu poszukaj rozwiązania, które obsługuje Android, z innej odpowiedzi!
Isaac Woods

String text = Files.readString(Paths.get("file"));jest jeszcze krótsza, zakładając, że chcesz otrzymać łańcuch znaków UTF-8.
Eagterrian Knight

A jeśli masz już obiekt File, możesz to zrobić file.toPath()wewnątrzreadAllBytes
Kartik Chugh

Ważne dla Androida: Call requires API level 26: java.nio.file.Files#readAllBytes- to samo dla readString.
Neph

33

Możesz spróbować użyć Scanner, jeśli używasz JDK5 lub nowszego.

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

Możesz też użyć guawy

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

4
Zwróć uwagę, że skaner powinien być zamknięty po użyciu.
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. Tylko mała literówka. :-)
pisaruk

1
Ten kod Scannerodczytuje tylko pierwsze 1024 bajty z pliku. Spójrz na kod źródłowy. Odczytuje bufor i sprawdza to za pomocą tego wyrażenia regularnego. To zawsze ważne - wtedy zwraca całą zawartość bufora. Domyślnie bufor ma rozmiar 1024 bajtów.
Enyby

2
To ZŁE podejście. Prawidłowe rozwiązanie (dla Java 1.7 i nowszych) to Files.readAllLines(). W przypadku starszych środowisk JRE FileInputStream.read()jest prawdopodobnie najlepsze. Nie jestem pewien, czy jest przenośny na wszystkie platformy (tzn. Ctl-Z jest rozpoznawany wszędzie) i łatwo jest przeoczyć wykonanie Scanner.close().
paulsm4

33

Jeśli używasz Java 5/6, możesz użyć Apache Commons IO do odczytu pliku na łańcuch. Klasa zawiera org.apache.commons.io.FileUtilskilka metod odczytu plików.

np. metodą FileUtils#readFileToString:

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

1
Jest to prawdopodobnie najłatwiejsze rozwiązanie przy użyciu biblioteki innej firmy.
srebrny

3
Minimalny kod do napisania; Wiele więcej bibliotek do dodania do projektu.
Please_Dont_Bully_Me_SO_Lords

2
Metoda readFileToString (File) z typu FileUtils jest przestarzała
JavaSheriff

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.