đọc toàn bộ tệp mà không cần sử dụng vòng lặp trong java


103

Có thể trùng lặp:
Cách tạo Chuỗi Java từ nội dung của tệp
Toàn bộ tệp văn bản thành Chuỗi trong Java

Tôi đang cố đọc nội dung của tệp bằng FileReader. Nhưng tôi muốn đọc tệp mà không cần đọc từng dòng. Có thể đọc toàn bộ tệp mà không cần vòng lặp. Tôi đang sử dụng mã sau

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

Mã này sẽ không biên dịch để bắt đầu.
Arya Pourtabatabaie

Có một Java 11 giải pháp một dòng như thế này: stackoverflow.com/a/52301018/942774
Hendrik

Câu trả lời:


129

Nếu tệp nhỏ , bạn có thể đọc toàn bộ dữ liệu một lần:

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
Không làm việc cho sa tài sản Android InputStream của (không chiều dài)
akauppi

10
Nhỏ như thế nào là "nhỏ"?
bạc,

8
@silver Toàn bộ nội dung của tệp sẽ được lưu trong bộ nhớ. Vì vậy, tránh đọc các tệp 5GB như thế này :-)
Thibaut D.

2
Lưu ý: file.length()có thể trả về 0 cho các tệp dưới /proc. Và trong những trường hợp đó, đoạn mã này sẽ trả về một chuỗi trống.
Mygod

1
Cũng readcó thể không lấp đầy toàn bộ bộ đệm. Nó có thể hoạt động trên thực tế với hầu hết các JRE, nhưng không có gì đảm bảo trong API.
Daniel Lubarov

179

Giải pháp một dòng Java 7

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

hoặc là

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

1
Không thể tìm thấy Tệp đó trong Android.
akauppi

23
Không phải tất cả các câu trả lời Java đều phải phù hợp với Android, @akauppi! Chỉ cần tìm một giải pháp mà Android hỗ trợ từ một câu trả lời khác!
Isaac Woods

String text = Files.readString(Paths.get("file"));thậm chí còn ngắn hơn, giả sử rằng bạn muốn đầu ra Chuỗi UTF-8.
Eagterrian Knight

Và nếu bạn đã có đối tượng tập tin, bạn có thể làm file.toPath()bên trongreadAllBytes
Kartik Chugh

Điều quan trọng đối với Android: Call requires API level 26: java.nio.file.Files#readAllBytes- điều tương tự đối với readString.
Neph

33

Bạn có thể thử sử dụng Máy quét nếu bạn đang sử dụng JDK5 trở lên.

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

Hoặc bạn cũng có thể sử dụng Ổi

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

4
Lưu ý rằng nên đóng máy quét sau khi sử dụng.
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. Chỉ là một lỗi đánh máy nhỏ. :-)
pisaruk

1
Mã này Scannerchỉ đọc 1024 byte đầu tiên từ tệp. Nhìn vào mã nguồn. Nó đọc bộ đệm và kiểm tra nó bằng regexp này. Điều này luôn hợp lệ - sau đó nó trả về tất cả nội dung bộ đệm. Theo mặc định bộ đệm có kích thước 1024 byte.
Enyby

2
Đây là cách tiếp cận BAD. Giải pháp chính xác (cho Java 1.7 trở lên) là Files.readAllLines(). Đối với JRE kế thừa, FileInputStream.read()có lẽ là tốt nhất. Tôi không chắc liệu nó có di động đến tất cả các nền tảng hay không (tức là Ctl-Z được công nhận ở mọi nơi), và thật dễ dàng bỏ lỡ việc làm a Scanner.close().
paulsm4

33

Nếu bạn đang sử dụng Java 5/6, bạn có thể sử dụng Apache Commons IO để đọc tệp thành chuỗi. Lớp có org.apache.commons.io.FileUtilsmột số phương thức cho các tệp đã đọc.

ví dụ: sử dụng phương pháp FileUtils#readFileToString:

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

1
Đây có lẽ là giải pháp dễ dàng nhất bằng cách sử dụng lib của bên thứ ba.
bạc

3
Mã tối thiểu để viết; Nhiều thư viện khác để thêm vào dự án.
Please_Dont_Bully_Me_SO_Lords

2
Phương thức readFileToString (Tệp) từ loại FileUtils không được dùng nữa
JavaSheriff

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.