ความแตกต่างระหว่าง java.io.PrintWriter และ java.io.BufferedWriter


97

โปรดดูรหัสด้านล่าง:

// A.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);

// B.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
BufferedWriter bWriter = new BufferedWriter(fileWriter);

สองวิธีนี้แตกต่างกันอย่างไร?

เมื่อใดที่เราควรใช้ PrintWriter กับ BufferedWriter

คำตอบ:


63

การอ้างอิง API สำหรับBufferedWriterและPrintWriter ให้รายละเอียดความแตกต่าง

เหตุผลหลักในการใช้ PrintWriter คือเพื่อเข้าถึงเมธอด printXXX เช่น println () โดยพื้นฐานแล้วคุณสามารถใช้ PrintWriter เพื่อเขียนลงไฟล์ได้เช่นเดียวกับที่คุณใช้ System.out เพื่อเขียนลงในคอนโซล

BufferedWriter เป็นวิธีที่มีประสิทธิภาพในการเขียนลงไฟล์ (หรืออย่างอื่น) เนื่องจากจะบัฟเฟอร์อักขระในหน่วยความจำ Java ก่อนหน้า (อาจขึ้นอยู่กับการนำไปใช้งาน) ไปที่ C เพื่อทำการเขียนไปยังไฟล์

ไม่มีแนวคิดเช่น "PrintReader"; ที่ใกล้เคียงที่สุดคุณจะได้รับน่าจะเป็นjava util สแกนเนอ


4
@TritonMan ในบางจุดจำเป็นต้องโต้ตอบกับระบบปฏิบัติการซึ่งหมายถึงการก้าวออกนอก Java
TofuBeer

แต่ PrintWriter ก็บัฟเฟอร์ด้วยใช่ไหม? ดังนั้นจึงไม่ใช่ความแตกต่างอย่างชัดเจนตามคำตอบของคุณ
Line

PrintWriter ถูกบัฟเฟอร์ แต่ความแตกต่างคือวิธีการพิมพ์ที่มี ฉันไม่คิดว่าฉันส่ออะไร ...
TofuBeer

สิ่งที่คุณเขียนเกี่ยวกับ BufferedWriter - มันเป็นความจริงสำหรับ PrintWriter หรือไม่? ยังไม่ชัดเจนสำหรับฉันเนื่องจากฉันคิดว่าคำตอบนี้เกี่ยวกับความแตกต่าง
Line

90

PrintWriterให้วิธีการมากขึ้น ( println) แต่ที่สำคัญที่สุด (และกังวล) ความแตกต่างที่จะตระหนักถึงก็คือว่ามันกลืนข้อยกเว้น

คุณสามารถโทรติดต่อcheckErrorได้ในภายหลังเพื่อดูว่ามีข้อผิดพลาดเกิดขึ้นหรือไม่ แต่โดยทั่วไปแล้วคุณจะใช้PrintWriterกับสิ่งต่างๆเช่นการเขียนลงคอนโซลหรือในแอป "ด่วนและสกปรก" ที่คุณไม่ต้องการให้เกิดข้อยกเว้น (และที่ ความน่าเชื่อถือในระยะยาวไม่ใช่ปัญหา)

ฉันไม่แน่ใจว่าเหตุใด "ความสามารถในการจัดรูปแบบพิเศษ" และ "ข้อยกเว้นไม่กลืน" จึงรวมอยู่ในคลาสเดียวกันเห็นได้ชัดว่าการจัดรูปแบบมีประโยชน์ในหลาย ๆ ที่ที่คุณไม่ต้องการให้มีการกลืนข้อยกเว้น คงจะดีไม่น้อยหากBufferedWriterได้เห็นความสามารถเดียวกันในบางจุด ...


@WindyFields: ไม่PrintStreamเป็นOutputStream. PrintWriterคือWriter.
Jon Skeet

ขอบคุณ. "มันกลืนข้อยกเว้น" คุณหมายถึง PrintWriter ไม่ได้เพิ่มข้อยกเว้นที่เลือกใช่หรือไม่? แล้ว excepitons ที่ไม่ได้ตรวจสอบล่ะ?

1
@ Ben: ผมได้พูดคุยเกี่ยวกับโดยเฉพาะIOExceptionในการที่ทุก IO นามธรรมอื่น ๆ ( Reader, Writerฯลฯ ) บอกว่าวิธีการโยนIOExceptionถ้าอะไรผิดพลาด - PrintWriterไม่ได้
Jon Skeet

8

ตามที่กล่าวไว้ในคำตอบของ TofuBeer ทั้งสองมีความพิเศษ หากต้องการใช้ประโยชน์จาก PrintWriter (หรือนักเขียนอื่น ๆ ) อย่างเต็มที่ แต่ยังใช้การเขียนบัฟเฟอร์คุณสามารถห่อ BufferedWriter ด้วยสิ่งที่จำเป็นเช่นนี้:

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));

2
โปรดจำไว้ว่า @Jons แสดงความคิดเห็นว่า PrintWriter จะกลืนข้อยกเว้น ควรเรียกใช้ checkError
MadMurf

4
อย่างน้อยในการใช้งาน openJDK 8 ปัจจุบัน (และอาจเป็นเวอร์ชันเก่ากว่า) PrinterWriterได้สร้างไฟล์BufferedWriter.
nimrodm

7

PrintWriter เพียงแค่แสดงวิธีการพิมพ์บน Writer ใด ๆ ในโหมดอักขระ

BufferedWriter มีประสิทธิภาพมากกว่าตามวิธีการบัฟเฟอร์ และมาพร้อมกับวิธีการ newLine () ขึ้นอยู่กับแพลตฟอร์มระบบของคุณเพื่อจัดการไฟล์ข้อความอย่างถูกต้อง

BufferedReader อนุญาตให้อ่านข้อความจากไฟล์โดยมีการแปลงไบต์เป็นอักขระ อนุญาตให้อ่านทีละบรรทัด

ไม่มี PrintReader คุณต้องเลือกการใช้งาน Reader อื่นตามรูปแบบของข้อมูลที่คุณป้อน


3

PrintWriterเป็น Writer ที่ได้รับการปรับปรุงมากที่สุดในการเขียนข้อมูลอักขระลงในไฟล์

ข้อได้เปรียบหลักของ PrintWriter เหนือ FileWriter และ BufferedWriter คือ:

  1. PrintWriter สามารถสื่อสารโดยตรงกับไฟล์และสามารถสื่อสารผ่านวัตถุ Writer บางตัวได้ด้วย

PrintWriter printwriter = new PrintWriter("blah.txt");

(หรือ)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. เราสามารถเขียนข้อมูล Primitive ประเภทใดก็ได้ลงในไฟล์โดยตรง (เนื่องจากเรามีเมธอด PrintWriter เวอร์ชันที่โอเวอร์โหลดเพิ่มเติมเช่น print () และ println ())

    printwriter.print(65); //65
    bufferedwriter.write(65); //A
    printwriter.println(true); //true


2

โดยทั่วไป Writer จะส่งเอาต์พุตไปยังอักขระพื้นฐานหรือไบต์สตรีมทันที เว้นแต่ว่าจำเป็นต้องมีเอาต์พุตพร้อมต์ขอแนะนำให้รวม BufferedWriter ไว้รอบ ๆ Writer ใด ๆ ที่การดำเนินการ write () อาจมีค่าใช้จ่ายสูงเช่น FileWriters และ OutputStreamWriters ตัวอย่างเช่น,

หมายเหตุ: เนื้อหาข้อความในบล็อกโค้ดจะถูกตัดคำโดยอัตโนมัติ

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

จะบัฟเฟอร์เอาต์พุตของ PrintWriter ไปยังไฟล์ หากไม่มีการบัฟเฟอร์การเรียกใช้เมธอด print () แต่ละครั้งจะทำให้อักขระถูกแปลงเป็นไบต์จากนั้นจะถูกเขียนลงในไฟล์ทันทีซึ่งอาจไม่มีประสิทธิภาพมาก


0

BufferedWriter - เขียนข้อความไปยังสตรีมอักขระเอาต์พุตบัฟเฟอร์อักขระจากสตรีมอักขระ PrintWriter - พิมพ์การแสดงรูปแบบของวัตถุไปยังสตรีมเอาต์พุตข้อความ


-1

ฉันคิดว่าเหตุผลเบื้องหลังการใช้ PrintWriter ได้กล่าวไว้ข้างต้นแล้ว แต่เหตุผลสำคัญประการหนึ่งคือคุณส่งไฟล์วัตถุไปยังตัวสร้าง PrintWriter โดยตรงซึ่งทำให้ใช้งานได้ง่าย

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.