การปิดสตรีมอย่างปลอดภัย
ทรัพยากรภายใน try-with-resources
การปิดสตรีมอย่างปลอดภัย เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องปิดกระแสข้อมูล
กระแสข้อมูลอย่าง BufferedReader ยึดครองทรัพยากรของระบบไว้ — ตัวจัดการไฟล์ บัฟเฟอร์หน่วยความจำ และการเชื่อมต่อ หากคุณไม่ปิดทรัพยากรเหล่านี้ ทรัพยากรเหล่านั้นอาจรั่วไหลได้
การปิดกระแสข้อมูลจะคืนทรัพยากรที่กระแสข้อมูลถือไว้และส่งข้อมูลที่ค้างอยู่ บทเรียนนี้จะแสดงวิธีดำเนินการอย่างปลอดภัย
เมธอด close
ตัวอ่านทุกตัวมีเมธอด close() การเรียกใช้เมธอดนี้จะปล่อยทรัพยากร
สำหรับ BufferedReader ที่ครอบ System.in ไว้ การปิดยังปิดกระแสข้อมูลพื้นฐานที่ครอบไว้อีกด้วย
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
// ... use br ...
br.close();วิธีแบบเก่าที่มีความเสี่ยง
คุณสามารถเรียกใช้ close() ด้วยตนเองได้ แต่หากเกิดข้อผิดพลาดก่อนที่บรรทัดนั้นจะทำงาน close() จะถูกข้ามไปและทรัพยากรจะรั่วไหล
การใส่ close() ไว้ในบล็อก finally ช่วยได้ แต่ทำให้โค้ดยืดยาวและผิดพลาดได้ง่าย
BufferedReader br = null;
try {
br = new BufferedReader(
new InputStreamReader(System.in));
// ... use br ...
} finally {
if (br != null) br.close();
}โครงสร้างการลองพร้อมทรัพยากร
Java มีวิธีแก้ที่สะอาดกว่า นั่นคือโครงสร้างการลองพร้อมทรัพยากร คุณประกาศกระแสข้อมูลไว้ภายในวงเล็บหลัง try แล้ว Java จะปิดกระแสข้อมูลนั้นโดยอัตโนมัติเมื่อบล็อกสิ้นสุดลง — แม้จะเกิดข้อผิดพลาดขึ้นก็ตาม
ไม่ต้องใช้ finally และไม่ต้องเรียกใช้ close() ด้วยตนเอง นี่คือแนวปฏิบัติที่ดีสมัยใหม่
try (BufferedReader br =
new BufferedReader(new InputStreamReader(System.in))) {
String line = br.readLine();
System.out.println(line);
}วิธีการทำงาน
ทรัพยากรใดก็ตามที่ประกาศในวงเล็บ try (...) ต้องใช้งาน AutoCloseable ได้ BufferedReader ใช้งานได้ ดังนั้น Java จึงเรียกใช้ close() ให้คุณ
การปิดจะเกิดขึ้นหลังจากบล็อกทำงานเสร็จ ไม่ว่าบล็อกจะสิ้นสุดตามปกติหรือสิ้นสุดด้วยข้อยกเว้น
ตัวอย่างฉบับสมบูรณ์
นี่คือโปรแกรมฉบับสมบูรณ์ที่ใช้โครงสร้างการลองพร้อมทรัพยากรเพื่ออ่านหนึ่งบรรทัด ตัวอ่านจะปิดโดยอัตโนมัติเมื่อสิ้นสุดบล็อก
โปรแกรมอ่านจาก System.in ดังนั้นจึงรอข้อมูลเข้าและไม่สามารถเรียกใช้โดยอัตโนมัติที่นี่ได้
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(System.in))) {
String name = br.readLine();
System.out.println("Hi " + name);
}
}
}เรียกใช้ได้ด้วย StringReader
เพื่อยืนยันว่าโครงสร้างการลองพร้อมทรัพยากรทำงานได้โดยไม่ต้องรับข้อมูลจากแป้นพิมพ์ ตัวอย่างนี้จึงอ่านจาก StringReader ซึ่งเรียกใช้ได้อย่างสมบูรณ์
หลังจากสิ้นสุดบล็อก ตัวอ่านจะถูกปิดโดยอัตโนมัติ — คุณไม่ต้องเขียนการเรียกใช้ close() ใด ๆ
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
try (BufferedReader br =
new BufferedReader(new StringReader("done"))) {
System.out.println(br.readLine());
}
}
}ทรัพยากรหลายรายการ
คุณสามารถประกาศทรัพยากรหลายรายการใน try เดียว โดยคั่นด้วยอัฒภาค Java จะปิดทรัพยากรทั้งหมดตามลำดับย้อนกลับจากลำดับที่ประกาศ
วิธีนี้มีประโยชน์เมื่อคุณครอบกระแสข้อมูลหลายรายการเข้าด้วยกัน
try (InputStreamReader isr =
new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr)) {
System.out.println(br.readLine());
}การดักจับ IOException
การอ่านอาจทำให้เกิด IOException ได้ คุณสามารถเพิ่ม catch ให้กับบล็อกการลองพร้อมทรัพยากร เพื่อจัดการข้อผิดพลาดแทนการประกาศ throws
ทรัพยากรยังคงถูกปิดโดยอัตโนมัติก่อนที่ catch จะทำงาน
try (BufferedReader br = new BufferedReader(
new InputStreamReader(System.in))) {
System.out.println(br.readLine());
} catch (IOException e) {
System.out.println("Read failed");
}ควรปิด System.in หรือไม่
ข้อควรระวังประการหนึ่งคือ การปิดตัวอ่านที่ใช้ System.in จะปิด System.in เองด้วย และคุณจะเปิดขึ้นมาใหม่ไม่ได้
สำหรับโปรแกรมสั้น ๆ วิธีนี้ไม่มีปัญหา แต่หากภายหลังคุณยังต้องใช้ข้อมูลเข้าจากคอนโซล อย่าปิดตัวอ่านนั้นโดยเฉพาะ โปรดทราบว่ากระแสข้อมูลของคุณครอบสิ่งใดไว้
แนวปฏิบัติที่ดี
เพื่อจัดการกระแสข้อมูลอย่างปลอดภัย:
- เลือกใช้โครงสร้างการลองพร้อมทรัพยากรแทนการเรียกใช้
close()ด้วยตนเอง - กระแสข้อมูลจะถูกปิดโดยอัตโนมัติแม้เกิดข้อผิดพลาด
- โปรดจำไว้ว่าการปิดตัวอ่าน
System.inจะปิดข้อมูลเข้ามาตรฐานด้วย
การจัดการทรัพยากรที่สะอาดช่วยป้องกันการรั่วไหลและข้อบกพร่อง
การตรวจสอบอย่างรวดเร็ว
ลองคิดถึงประโยชน์หลักของโครงสร้างการลองพร้อมทรัพยากร
ทบทวน
คุณได้เรียนรู้ว่าเหตุใดจึงต้องปิดกระแสข้อมูล ได้เห็นวิธีจัดการด้วยตนเองและ finally ที่มีความเสี่ยง และได้เรียนรู้รูปแบบโครงสร้างการลองพร้อมทรัพยากรที่สะอาด ซึ่งจะปิดทรัพยากร AutoCloseable โดยอัตโนมัติ
ตอนนี้คุณสามารถอ่านข้อมูลเข้าด้วย BufferedReader ได้อย่างปลอดภัยตั้งแต่ต้นจนจบ
เรียนรู้ Java ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 104
- บทเรียน
- 374
คำถามที่พบบ่อย
บทเรียน “การปิดสตรีมอย่างปลอดภัย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การปิดสตรีมอย่างปลอดภัย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การปิดสตรีมอย่างปลอดภัย”
ทรัพยากรภายใน try-with-resources คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การปิดสตรีมอย่างปลอดภัย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุผลที่ใช้ BufferedReader
- การอ่านทีละบรรทัด
- การแยกตัวเลขจากข้อมูลนำเข้า
- การปิดสตรีมอย่างปลอดภัย