เมื่อเราหัดเขียนภาษาจาวา โปรแกรมแรกที่เราเขียนคือพิมพ์คำว่า Hello World! ซึ่งข้อความถูกสั่งพิมพ์ด้วยคลาส System ดังตัวอย่างด้านล่าง โดยข้อความจะถูกสั่งพิมพ์ไปที่หน้าต่างคอนโซลในโปรแกรม IDE ซึ่ง System.out ในภาษาจาวาก็คือ output stream แบบนึงซึ่งจะเอาข้อมูลไปพิมพ์ที่หน้าต่างคอนโซล

System.out.println("Hello World!");

ถ้าเรามองว่าหน้าต่างคอนโซลคือปลายทางชนิดหนึ่งที่เราส่งข้อมูลออกไปเพื่อไปพิมพ์หรือเขียน ดังนั้นนอกจากหน้าต่างคอนโซลแล้วปลายทางของเราสามารถเป็น ไฟล์ ดิสก์ หน่วยความจำ web socket หรือ ปลายทางแบบใดแบบหนึ่งในเครือข่ายก็ได้ เราสามารถส่งข้อมูลออกไปยังปลายทางแบบต่างๆได้โดยเลือกใช้คลาสที่มีมาใน Java API ซึ่งมีคลาสในกลุ่ม output stream ให้เราเลือกใช้มากมาย โดยแต่ละคลาสมีคามเกี่ยวข้องกันดังโครงสร้างด้านล่าง

จากโครงสร้างด้านบนส่วนที่เกี่ยวข้องกับคำสั่งที่เราใช้พิมพ์ Hello World! คือคลาส PrinStream โดยคลาส System จะมีฟิลด์ชื่อ out ซึ่งมีชนิดของข้อมูลเป็นชนิด PrinStream ดังนั้นในการใช้งานเราจึงอ้างถึงเมธอด println ในคลาส PrinStream จากฟิลด์ out ได้ว่า System.out.println()

เราลองมาดูโครงสร้างจะเห็นว่าแบ่งเป็น 2 ส่วนคือฝั่ง Writer กับฝั่ง OutputStream ข้อแตกต่างของทั้ง 2 ฝั่งคือ OutputStream จะเขียนข้อมูลในรูปแบบไบต์ (byte) ส่วน Writer มีการประยุกต์เอาเรื่องตัวอักษรมาใช้งานด้วยดังนั้น Writer จะเขียนข้อมูลในรูปแบบตัวอักษร (char หรือ String) ก็คือมีเรื่อง encode เข้ามาเกี่ยวด้วย รูปด้านล่างขยายทั้ง 2 ฝั่งออกมาให้เห็นง่ายขึ้น