Java Academy · บทเรียน

การปิดสตรีมอย่างปลอดภัย

ทรัพยากรภายใน try-with-resources

บทเรียน 4 จาก 413 ขั้นตอน

การปิดสตรีมอย่างปลอดภัย เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เหตุผลที่ใช้ BufferedReader
  2. การอ่านทีละบรรทัด
  3. การแยกตัวเลขจากข้อมูลนำเข้า
  4. การปิดสตรีมอย่างปลอดภัย
← กลับไปที่ Java Academy