อ่านไฟล์ทั้งหมดโดยไม่ต้องใช้ loop ใน java


103

Possible Duplicate:
วิธีสร้าง Java String จากเนื้อหาของไฟล์
Whole text file ไปยัง String ใน Java

ฉันพยายามอ่านเนื้อหาของไฟล์โดยใช้ FileReader แต่ฉันต้องการอ่านไฟล์โดยไม่ต้องอ่านทีละบรรทัด เป็นไปได้ไหมที่จะอ่านทั้งไฟล์โดยไม่ต้องวนซ้ำ ฉันใช้รหัสต่อไปนี้

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

โค้ดนี้จะไม่คอมไพล์ขึ้นต้นด้วย
Arya Pourtabatabaie

มีโซลูชัน Java 11 แบบบรรทัดเดียวสำหรับสิ่งนี้: stackoverflow.com/a/52301018/942774
Hendrik

คำตอบ:


129

หากไฟล์มีขนาดเล็กคุณสามารถอ่านข้อมูลทั้งหมดได้ครั้งเดียว:

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
ใช้ไม่ได้กับเนื้อหาบน Android ของ InputStream (ไม่มีความยาว)
akauppi

10
"เล็ก" แค่ไหน?
เงิน

8
@silver เนื้อหาทั้งหมดของไฟล์จะถูกเก็บไว้ในหน่วยความจำ ดังนั้นหลีกเลี่ยงการอ่านไฟล์ 5GB เช่นนี้ :-)
Thibaut D.

2
หมายเหตุ: file.length()อาจส่งคืน 0 สำหรับไฟล์ภายใต้/proc. และในกรณีเหล่านั้นตัวอย่างข้อมูลนี้จะส่งคืนสตริงว่าง
Mygod

1
นอกจากนี้readอาจไม่เติมเต็มบัฟเฟอร์ทั้งหมด อาจใช้งานได้จริงกับ JRE ส่วนใหญ่ แต่ไม่มีการรับประกันใน API
Daniel Lubarov

179

โซลูชัน Java 7 บรรทัดเดียว

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

หรือ

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

1
ไม่พบไฟล์นั้นใน Android
akauppi

23
ไม่ใช่ทุกคำตอบของ Java ที่จะต้องเหมาะกับ Android @akauppi! เพียงแค่มองหาโซลูชันที่ Android รองรับจากคำตอบอื่น!
Isaac Woods

String text = Files.readString(Paths.get("file"));จะยิ่งสั้นกว่านี้โดยสมมติว่าคุณต้องการเอาต์พุตสตริง UTF-8
Eagterrian Knight

และถ้าคุณมีวัตถุ File อยู่แล้วคุณสามารถทำได้file.toPath()ภายในreadAllBytes
Kartik Chugh

สิ่งสำคัญสำหรับ Android: Call requires API level 26: java.nio.file.Files#readAllBytes- สิ่งเดียวกันสำหรับreadString.
Neph

33

คุณสามารถลองใช้Scanner ได้หากคุณใช้ JDK5 ขึ้นไป

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

หรือจะใช้Guava ก็ได้

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

4
โปรดทราบว่าควรปิดสแกนเนอร์หลังใช้งาน
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. พิมพ์ผิดเล็ก ๆ น้อย ๆ :-)
pisaruk

1
รหัสนี้Scannerอ่านเฉพาะ 1024 ไบต์แรกจากไฟล์ ดูที่ซอร์สโค้ด มันอ่านบัฟเฟอร์และตรวจสอบด้วย regexp นี้ สิ่งนี้ใช้ได้เสมอ - จากนั้นจะส่งคืนเนื้อหาบัฟเฟอร์ทั้งหมด โดยค่าเริ่มต้นบัฟเฟอร์มีขนาด 1024 ไบต์
Enyby

2
นี่คือแนวทางที่ไม่ดี วิธีการแก้ปัญหาที่ถูกต้อง (สำหรับ Java 1.7 และสูงกว่า) Files.readAllLines()คือ สำหรับ JRE แบบเดิมFileInputStream.read()น่าจะดีที่สุด ฉันไม่แน่ใจว่ามันพกพาไปได้ทุกแพลตฟอร์ม (เช่น Ctl-Z เป็นที่รู้จักทุกที่) และมันง่ายที่จะพลาดการทำไฟล์Scanner.close().
paulsm4

33

หากคุณใช้ Java 5/6 คุณสามารถใช้Apache Commons IOเพื่ออ่านไฟล์เป็นสตริง คลาสorg.apache.commons.io.FileUtilsนี้มีหลายวิธีในการอ่านไฟล์

เช่นใช้วิธีการFileUtils#readFileToString:

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

1
นี่อาจเป็นวิธีแก้ปัญหาที่ง่ายที่สุดโดยใช้ lib ของบุคคลที่สาม
เงิน

3
เขียนโค้ดน้อยที่สุด ห้องสมุดอื่น ๆ อีกมากมายที่จะเพิ่มลงในโครงการ
Please_Dont_Bully_Me_SO_Lords

2
เมธอด readFileToString (File) จากประเภท
FileUtils

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.