1. URLชั้นเรียน
เราได้ศึกษาการทำงานกับสตรีม I/O เราได้ศึกษาการทำงานกับไฟล์ เราควรเรียนอะไรต่อไปดี? แล้วการทำงานกับเครือข่ายรวมถึงอินเทอร์เน็ตล่ะ? ฟังดูดีใช่ไหม?
ใน Java การทำงานกับอินเทอร์เน็ตนั้นไม่ยากไปกว่าการทำงานกับไฟล์ ก็อาจจะเพียงเล็กน้อย
ในการทำงานกับแหล่งข้อมูลทางอินเทอร์เน็ต Java มีคลาสพิเศษURL— มันง่ายเหมือนอุจจาระอย่างที่คุณเห็นในตอนนี้
รับทำเว็บเพจ
คุณคิดว่าต้องเขียนโค้ดกี่บรรทัดเพื่อดาวน์โหลดไฟล์ข้อความจากอินเทอร์เน็ตและแสดงเนื้อหาบนหน้าจอ 10? 100? 1,000? หรืออาจจะ 5?
| รหัส | บันทึก |
|---|---|
|
สร้างวัตถุ URL ที่มีเส้นทางไปยังหน้า รับ InputStreamจากวัตถุ URL อ่านไบต์ทั้งหมดและส่งกลับอาร์เรย์ของไบต์ แปลงอาร์เรย์เป็นสตริง แสดงสตริง |
เนื้อหาของไฟล์ HTML จะแสดงบนหน้าจอ:
| เอาต์พุตคอนโซล |
|---|
|
เปรียบเทียบการทำงานกับFileและURL
URLคล้ายกับFileหรือPathแต่Pathเก็บเส้นทางไปยังทรัพยากรในระบบไฟล์ และURLเก็บเส้นทางไปยังทรัพยากรบนอินเทอร์เน็ต
ความมหัศจรรย์ทั้งหมดเกิดขึ้นเมื่อเราได้รับInputStreamวัตถุด้วยการเรียกใช้เมธอดเพียงครั้งopenStream()เดียว นี่เป็นวัตถุธรรมดาและเราได้ศึกษามาแล้วทั้งภายนอกและภายใน ทุกอย่างจะชัดเจนหลังจากที่เราได้รับInputStreamวัตถุ ท้ายที่สุดเรารู้วิธีรับข้อมูลจากมันแล้ว
ลองดู: เฉพาะสองบรรทัดแรกเท่านั้นที่แตกต่างกันและเพียงเล็กน้อยเท่านั้น และตอนนี้คุณก็เห็นแล้ว — ข้อได้เปรียบของการสร้างมาตรฐานและการทำงานกับกลุ่มของสตรีมข้อมูล:
| การทำงานกับอินเทอร์เน็ต | การทำงานกับไฟล์ |
|---|---|
|
|
2. URLConnectionชั้นเรียน
นอกจากการอ่านข้อมูลจากอินเทอร์เน็ตแล้ว เรายังสามารถอัพโหลดข้อมูลได้อีกด้วย การอัปโหลดข้อมูลนั้นซับซ้อนกว่าการอ่านข้อมูลมาก คุณจะต้องใช้วิธีอื่นอีกสองสามวิธี ตัวอย่างเช่น:
| รหัส | บันทึก |
|---|---|
|
สร้างวัตถุ 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 ลงในดิสก์
โดยหลักการแล้วไม่มีอะไรซับซ้อนที่นี่ ในรูปแบบที่ง่ายที่สุด รหัสนี้จะมีลักษณะดังนี้:
| การบันทึกไฟล์ลงดิสก์ |
|---|
|
ด้วยความช่วยเหลือของสามบรรทัดแรก เราได้รับสตรีมข้อมูลจากแหล่งข้อมูลทางอินเทอร์เน็ต — จากรูปภาพ
ในบรรทัดที่สี่ เราสร้างชื่อไฟล์ที่เราจะบันทึกภาพ ชื่อสามารถเป็นอะไรก็ได้ แต่นามสกุลไฟล์ต้องตรงกับนามสกุลของรูปภาพบนอินเทอร์เน็ต ซึ่งจะช่วยให้ผู้ดูรูปภาพในท้องถิ่นสามารถเปิดได้อย่างถูกต้อง
และสุดท้าย บรรทัดสุดท้ายเป็นหนึ่งในวิธีการFilesของชั้นเรียน copyชั้นFilesเรียนมีหลายคน วิธีนี้เราใช้ byte stream ( InputStream) เป็นพารามิเตอร์แรกและเป็นพารามิเตอร์ที่สอง — ชื่อของไฟล์ที่ควรเขียนข้อมูล
ในทางทฤษฎี หากURLรูปภาพมีขนาดสั้น รหัสนี้อาจเขียนได้ในบรรทัดเดียว:
| การคัดลอกข้อมูลจากสตรีมไปยังไฟล์ |
|---|
|
แน่นอน คุณไม่จำเป็นต้องเขียนแบบนี้ แต่ตัวอย่างนี้แสดงให้เห็นว่าสตรีม I/O ที่สะดวกและมีประสิทธิภาพใน Java เป็นอย่างไร
GO TO FULL VERSION