1. URLชั้นเรียน

เราได้ศึกษาการทำงานกับสตรีม I/O เราได้ศึกษาการทำงานกับไฟล์ เราควรเรียนอะไรต่อไปดี? แล้วการทำงานกับเครือข่ายรวมถึงอินเทอร์เน็ตล่ะ? ฟังดูดีใช่ไหม?

ใน Java การทำงานกับอินเทอร์เน็ตนั้นไม่ยากไปกว่าการทำงานกับไฟล์ ก็อาจจะเพียงเล็กน้อย

ในการทำงานกับแหล่งข้อมูลทางอินเทอร์เน็ต Java มีคลาสพิเศษURL— มันง่ายเหมือนอุจจาระอย่างที่คุณเห็นในตอนนี้

รับทำเว็บเพจ

คุณคิดว่าต้องเขียนโค้ดกี่บรรทัดเพื่อดาวน์โหลดไฟล์ข้อความจากอินเทอร์เน็ตและแสดงเนื้อหาบนหน้าจอ 10? 100? 1,000? หรืออาจจะ 5?

รหัส บันทึก
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
สร้างวัตถุ URL ที่มีเส้นทางไปยังหน้า
รับInputStreamจากวัตถุ URL
อ่านไบต์ทั้งหมดและส่งกลับอาร์เรย์ของไบต์
แปลงอาร์เรย์เป็นสตริง
แสดงสตริง

เนื้อหาของไฟล์ HTML จะแสดงบนหน้าจอ:

เอาต์พุตคอนโซล
<!DOCTYPE html><html lang="ru" class="light"><head>
    <meta charset="utf-8″>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1″>
    ...

เปรียบเทียบการทำงานกับFileและURL

URLคล้ายกับFileหรือPathแต่Pathเก็บเส้นทางไปยังทรัพยากรในระบบไฟล์ และURLเก็บเส้นทางไปยังทรัพยากรบนอินเทอร์เน็ต

ความมหัศจรรย์ทั้งหมดเกิดขึ้นเมื่อเราได้รับInputStreamวัตถุด้วยการเรียกใช้เมธอดเพียงครั้งopenStream()เดียว นี่เป็นวัตถุธรรมดาและเราได้ศึกษามาแล้วทั้งภายนอกและภายใน ทุกอย่างจะชัดเจนหลังจากที่เราได้รับInputStreamวัตถุ ท้ายที่สุดเรารู้วิธีรับข้อมูลจากมันแล้ว

ลองดู: เฉพาะสองบรรทัดแรกเท่านั้นที่แตกต่างกันและเพียงเล็กน้อยเท่านั้น และตอนนี้คุณก็เห็นแล้ว — ข้อได้เปรียบของการสร้างมาตรฐานและการทำงานกับกลุ่มของสตรีมข้อมูล:

การทำงานกับอินเทอร์เน็ต การทำงานกับไฟล์
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
File file = new File("c:\\readme.txt");
InputStream input = new FileInputStream(file);

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);


2. URLConnectionชั้นเรียน

นอกจากการอ่านข้อมูลจากอินเทอร์เน็ตแล้ว เรายังสามารถอัพโหลดข้อมูลได้อีกด้วย การอัปโหลดข้อมูลนั้นซับซ้อนกว่าการอ่านข้อมูลมาก คุณจะต้องใช้วิธีอื่นอีกสองสามวิธี ตัวอย่างเช่น:

รหัส บันทึก
URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Get a stream for sending data
OutputStream output = connection.getOutputStream();
output.write(1); // Send data

// Get a stream for reading data
InputStream input = connection.getInputStream();
int data = input.read(); // Read data
สร้างวัตถุ URL ที่มีพาธไปยังเพจ
สร้างการเชื่อมต่อแบบสองทาง


รับสตรีมเอาต์พุต
ใส่ข้อมูลเข้าไป


รับสตรีมอินพุต
อ่านข้อมูลจากมัน

โปรดทราบว่าเราไม่ได้เรียกurl.openStream()เมธอดที่นี่ อีกต่อไป เราใช้เส้นทางที่ยาวกว่าแทน:

  • ก่อนอื่นเราสร้างการเชื่อมต่อสองทางที่เสถียรโดยใช้URLConnection.openConnection()วิธีการ
  • จากนั้นเราจะได้รับสตรีมเพื่อส่งข้อมูลโดยใช้connection.getOutputStream()เมธอดและส่งข้อมูลไปยังเซิร์ฟเวอร์
  • จากนั้นเราจะได้รับสตรีมสำหรับอ่านข้อมูลโดยใช้connection.getInputStream()วิธีการและเริ่มอ่านข้อมูลจากมัน

การจัดการทรัพยากร

พูดตามตรง เราควรห่อสตรีมทั้งหมดไว้ในtry-with-resourcesบล็อกเพื่อความปลอดภัยในการจัดการ และมันจะไม่เจ็บที่จะห่อเปลือยInputStreamและOutputStreamในสิ่งที่สะดวกกว่า ตัวอย่างเช่น ในPrintStreamและBufferedReader.

หากเราทำทั้งหมดแล้ว โค้ดของเราจะมีลักษณะดังนี้:

URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Send data
try (OutputStream output = connection.getOutputStream();
   PrintStream sender = new PrintStream(output))
{
   sender.println("Hello");
}

// Read data
try(InputStream input = connection.getInputStream();
   BufferedReader reader = new BufferedReader(new InputStreamReader(input)))
{
   while (reader.ready())
      System.out.println(reader.readLine());
}

3. ตัวอย่างการทำงานกับเครือข่าย

มาดาวน์โหลดบางอย่างจากอินเทอร์เน็ตกันเถอะ และไม่เพียงแค่ดาวน์โหลด แต่บันทึกลงดิสก์

ตัวอย่างเช่น ลองเขียนโปรแกรมที่บันทึกรูปภาพจากหน้าแรกของ Google ลงในดิสก์

โดยหลักการแล้วไม่มีอะไรซับซ้อนที่นี่ ในรูปแบบที่ง่ายที่สุด รหัสนี้จะมีลักษณะดังนี้:

การบันทึกไฟล์ลงดิสก์
String image = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
URL url = new URL(image);
InputStream input = url.openStream();

Path path = Path.of("c:\\GoogleLogo.png");
Files.copy(input, path);

ด้วยความช่วยเหลือของสามบรรทัดแรก เราได้รับสตรีมข้อมูลจากแหล่งข้อมูลทางอินเทอร์เน็ต — จากรูปภาพ

ในบรรทัดที่สี่ เราสร้างชื่อไฟล์ที่เราจะบันทึกภาพ ชื่อสามารถเป็นอะไรก็ได้ แต่นามสกุลไฟล์ต้องตรงกับนามสกุลของรูปภาพบนอินเทอร์เน็ต ซึ่งจะช่วยให้ผู้ดูรูปภาพในท้องถิ่นสามารถเปิดได้อย่างถูกต้อง

และสุดท้าย บรรทัดสุดท้ายเป็นหนึ่งในวิธีการFilesของชั้นเรียน copyชั้นFilesเรียนมีหลายคน วิธีนี้เราใช้ byte stream ( InputStream) เป็นพารามิเตอร์แรกและเป็นพารามิเตอร์ที่สอง — ชื่อของไฟล์ที่ควรเขียนข้อมูล

ในทางทฤษฎี หากURLรูปภาพมีขนาดสั้น รหัสนี้อาจเขียนได้ในบรรทัดเดียว:

การคัดลอกข้อมูลจากสตรีมไปยังไฟล์
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

แน่นอน คุณไม่จำเป็นต้องเขียนแบบนี้ แต่ตัวอย่างนี้แสดงให้เห็นว่าสตรีม I/O ที่สะดวกและมีประสิทธิภาพใน Java เป็นอย่างไร