ใน Java มี 2 ทางเลือกในการใช้งานไอโอ (I/O) คือ ไอโอ (IO) กับ เอ็นไอโอ (NIO) โดยเอ็นไอโอนั้นสามารถเลือกได้ว่าจะใช้งานแบบบล็อกกิ้ง (blocking) หรือไม่ โดยส่วนมากเลือกใช้เอ็นไอโอเพียงเพราะว่าใหม่กว่า น่าจะต้องดีกว่า จึงเกิดคำถามในการออกแบบโปรแกรมว่า แบบไหนดีกว่ากัน เมื่อค้นหาข้อมูลจึงพบการวิเคราะห์ที่น่าสนใจในบล็อก jenkov.com
ไอโอจะใช้สตรีม (stream) เป็นหลัก ในขณะทีเอ็นไอโอนั้นจะใช้งาน(ไบต์)บัฟเฟอร์ (ByteBuffer) เป็นหลัก ส่วนการทำงานแบบน็อนบล็อกกิ้ง (non-blocking) จะใช้งานผ่านเซเล็กเตอร์ (Selector) ซึ่งข้อดีก็คือสามารถควบคุมการทำงานได้มากกว่า 1 แชนแนล (channel)
บ่อยครั้งที่เขียนโปรแกรม พยายามที่จะใช้เอ็นไอโอแต่เนื่องจากข้อมูลในบัฟเฟอร์มีอยู่มาก เพื่อความสมบูรณ์ของข้อมูล ยังไงก็ต้องวนรอบ (loop) การส่งด้วยคำสั่ง ByteBuffer.hasRemaining() และ ByteBuffer.flush() อยู่ดี จึงอาจจะไม่เกิดประโยชน์ที่จะมาใช้งานน็อนบล็อกกิ้ง การเขียนโปรแกรมโดยใช้เอ็นไอโอนั้นทำให้โครงสร้างโปรแกรมซับซ้อนขึ้นมามาก
ตอนท้ายของบล็อกอ้างอิงได้สรุปแบบเข้าใจง่ายๆว่า
- เอ็นไอโอเหมาะกับการกระจายข้อมูลเล็กๆไปยังหลายแชนแนลพร้อมๆกัน เช่น ระบบแชท หรือ ระบบพีทูพี (P2P: Peer-to-peer) จึงสามารถใช้ประโยชน์ของน็อนบล็อกกิ้งได้เต็มประสิทธิภาพมากกว่า
- ไอโอเหมาะกับการใช้แชนแนลน้อยๆแต่แบนด์วิดธ์ (bandwidth) สูงๆ ส่งข้อมูลทีละมากๆ เช่น ระบบที่มีแชนแนลที่ต่อถาวรและส่งข้อมูลจากจุดหนึ่งไปยังอีกจุดหนึ่งเท่านั้น (Dedicated channel)
โปรดใช้วิจารณญาณในการเลือก เพราะเป็นเพียงข้อแนะนำ ไม่ใช่ว่าจะถูกต้องเสมอไป ถ้าสนใจตามไปดูการวิเคราะห์ทั้งหมดได้เลย
ที่มา: http://tutorials.jenkov.com/java-nio/nio-vs-io.html
สแลช (Slash)