หน้าที่ที่สำคัญที่สุดของคอมพิวเตอร์คือการประมวลผลข้อมูล ภาษาคอมพิวเตอร์ที่มีประโยชน์จำเป็นต้องมีความสามารถ IO ที่ดี เพื่อให้ข้อมูลที่ยังไม่ได้ประมวลผลไหลเข้าสู่โปรแกรมและข้อมูลที่ถูกประมวลผลจะไหลออก
เมื่อเปรียบเทียบกับภาษาอื่นๆ ฟังก์ชัน IO ของ Java นั้นซับซ้อน ในภาษาอื่นๆ ฟังก์ชัน IO จำนวนมาก (เช่น การอ่านไฟล์) จะถูกห่อหุ้มไว้และสามารถนำไปใช้กับโปรแกรมหนึ่งหรือสองบรรทัดได้ ใน Java โปรแกรมเมอร์มักต้องการการตกแต่งหลายระดับเพื่อให้สามารถอ่านไฟล์ได้
ประโยชน์ของความซับซ้อนสัมพัทธ์คือความยืดหยุ่นของ IO ใน Java โปรแกรมเมอร์สามารถควบคุมกระบวนการทั้งหมดของ IO เพื่อออกแบบวิธีการ IO ที่ดีที่สุดได้ เราจะเห็นเพิ่มเติมด้านล่าง
ตัวอย่างไอโอ
ด้านล่างนี้เป็นไฟล์ file.txt ที่ผมใช้ในการสาธิต
สวัสดีชาวโลก!สวัสดีเนิร์ด!
เรามาศึกษาตัวอย่างการอ่านไฟล์กันก่อน:
นำเข้า java.io.*; การทดสอบคลาสสาธารณะ { public static void main (String [] args) { ลอง { BufferedReader br = new BufferedReader (new FileReader ("file.txt")); String line = br.readLine (); ในขณะที่ (บรรทัด != null) { System.out.println(line); line = br.readLine(); } br.close(); } catch(IOException จ) { System.out.println("ปัญหา IO");
โปรแกรมนี้ประกอบด้วยตัวจัดการข้อยกเว้น try...catch...ในที่สุด โปรดดูบทช่วยสอนขั้นสูงของ Java เกี่ยวกับการจัดการข้อยกเว้น
มัณฑนากรและการผสมผสานฟังก์ชั่น
กุญแจสำคัญในการเขียนโปรแกรม IO คือการสร้างวัตถุ BufferedReader br:
BufferedReader br = BufferedReader ใหม่ (FileReader ใหม่ ("file.txt"));
ในระหว่างกระบวนการสร้าง อันดับแรกเราสร้างออบเจ็กต์ FileReader หน้าที่ของออบเจ็กต์นี้คือการอ่านไบต์สตรีมจากไฟล์ "file.txt" และแปลงเป็นสตรีมข้อความ ใน Java การเข้ารหัสข้อความมาตรฐานคือยูนิโค้ด BufferedReader() ได้รับวัตถุ FileReader ขยายฟังก์ชันของ FileReader และสร้างวัตถุ BufferedReader ใหม่ นอกเหนือจากฟังก์ชันการอ่านและการแปลงไฟล์ที่กล่าวมาข้างต้นแล้ว ออบเจ็กต์นี้ยังมีฟังก์ชันการอ่านแคช (บัฟเฟอร์) อีกด้วย สุดท้ายนี้ เราสามารถอ่านไฟล์ทีละบรรทัดได้โดยการเรียกเมธอด readLine() บนอ็อบเจ็กต์ br
(การอ่านแคชคือการเปิดพื้นที่ในหน่วยความจำเป็นแคช ซึ่งจัดเก็บสตรีมข้อความที่อ่านโดย FileReader เมื่อมีการอ่านเนื้อหาแคช (เช่นคำสั่ง readLine()) แคชจะโหลดสตรีมข้อความที่ตามมา)
BufferedReader() เป็นมัณฑนากรที่รับวัตถุดั้งเดิมและส่งกลับวัตถุที่ตกแต่งด้วยฟังก์ชันที่ซับซ้อนมากขึ้น ประโยชน์ของมัณฑนากรคือสามารถใช้ตกแต่งวัตถุต่างๆได้ สิ่งที่เรากำลังแก้ไขที่นี่คือสตรีมข้อความที่อ่านจากไฟล์ สตรีมข้อความอื่นๆ เช่น อินพุตมาตรฐาน สตรีมการส่งผ่านเครือข่าย ฯลฯ สามารถแก้ไขได้โดย BufferedReader() เพื่อให้ได้การอ่านที่แคชไว้
แผนภาพด้านล่างแสดงวิธีการทำงานของ br โดยมีข้อมูลที่ไหลจากล่างขึ้นบน:
กระบวนการตกแต่งข้างต้นคล้ายกับแนวคิดสตรีมข้อความใน Linux มาก ใน Linux เราใช้วิธีการคล้ายฟังก์ชันในการประมวลผลและส่งข้อความสตรีม ใน Java เราใช้มัณฑนากร แต่จุดประสงค์ของพวกเขาคล้ายกัน นั่นคือเพื่อให้บรรลุการทำให้เป็นโมดูลและการผสมผสานฟังก์ชันต่างๆ ได้ฟรี
การรวมกันมากขึ้น
ในความเป็นจริง Java มีชุดตกแต่งมากมาย FileReader รวมสองขั้นตอนในการอ่านและการแปลง และใช้การตั้งค่าเริ่มต้นที่ใช้กันทั่วไป เช่น ยูนิโค้ดสำหรับการเข้ารหัส เราสามารถใช้การรวมกันของ FileInputStream + InputStreamReader เพื่อแทนที่ FileReader ซึ่งจะแยกสองขั้นตอนในการอ่านไบต์และการแปลง และควบคุมทั้งสองกระบวนการได้ดีขึ้น
(แน่นอนว่า FileReader ใช้งานได้สะดวกกว่า InputStreamReader แปลง FileInputStream ให้เป็น Reader เพื่อประมวลผลข้อความ Unicode)
ลูกศรแสดงทิศทางการไหลของข้อมูล
การอ่านและการเขียนสตรีมมาจากคลาสพื้นฐานสี่คลาส: InputStream, OutputStream, Reader และ Writer InputStream และ Reader จัดการการอ่าน และ OutputStream และ Writer จัดการการเขียน ทั้งคู่อยู่ในแพ็คเกจ java.io ความสัมพันธ์ทางมรดกมีดังนี้:
จาวา.io
นอกจากนี้ IOException ยังมีคลาสที่ได้รับดังต่อไปนี้:
IOข้อยกเว้น
Reader และ Writer และคลาสที่ได้รับจะจัดการข้อความ Unicode ดังที่เราเห็น Buffered Reader, InputStreamReader หรือ FileReader
InputStream และ OutputStream และคลาสที่ได้รับจะจัดการสตรีมไบต์ ข้อมูลในคอมพิวเตอร์สามารถพิจารณาได้ในรูปแบบไบต์ ดังนั้น InputStream และ OutputStream จึงสามารถใช้เพื่อประมวลผลข้อมูลได้หลากหลายยิ่งขึ้น ตัวอย่างเช่น เราสามารถใช้ชุดค่าผสมต่อไปนี้เพื่ออ่านข้อมูล (เช่น จำนวนเต็ม) ที่มีอยู่ในไฟล์บีบอัด:
ลูกศรแสดงทิศทางการไหลของข้อมูล
เราอ่านไบต์สตรีมจากไฟล์บีบอัด จากนั้นขยายขนาด และสุดท้ายก็อ่านข้อมูล
เขียน
การดำเนินการเขียนจะคล้ายกับการดำเนินการอ่าน เราสามารถใช้ฟังก์ชันการเขียนที่ซับซ้อนได้โดยใช้การตกแต่ง นี่เป็นตัวอย่างง่ายๆ ของการเขียนข้อความ:
import java.io.*;public class Test{ public static void main(String[] args) { try { String content = "ขอบคุณสำหรับปลาของคุณ"; / สร้างไฟล์หากไม่มีอยู่ถ้า (!file.exists()) { file.createNewFile(); } FileWriter fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = ใหม่ BufferedWriter(fw); bw.write(content); bw.close(); } catch(IOException e) { System.out.println("ปัญหา IO");
วัตถุไฟล์ถูกสร้างขึ้นด้านบนเพื่อประมวลผลเส้นทางของไฟล์
สรุป
นี่เป็นเพียงการแนะนำเบื้องต้นเกี่ยวกับ Java IO IO ของ Java ค่อนข้างซับซ้อน โปรแกรมเมอร์ Java ต้องใช้เวลาพอสมควรในการทำความคุ้นเคยกับคลาสใน java.io และฟังก์ชันการทำงานของพวกเขา