Java platformu farklı türlerde bilgi kaynağını ve bilgi alıcısını destekler. Bir program bir bilgi kaynağından veri alabilir, bu disk üzerindeki bir dosya, bir network bağlantısı, başka bir program, standart girdi (örneğin klavye) olabilir. Benzer şekilde, bir program bir bilgi alıcısına veri gönderebilir, bu bu disk üzerindeki bir dosya, bir network bağlantısı, başka bir program, standart çıktı (örneğin monitör) olabilir. Java girdi çıktı (I/O) sisteminde akımlar bilgi kaynağından veya bilgi alıcısından bilgi alıp vermek için kullanılabilirler.
Aslında iki çeşit akım vardır: byte tabanlı ve karakter tabanlı. Byte tabanlı akımlar akımlardan byte okur ve akımlara byte yazarlar. Bilginin akış yönüne göre byte tabanlı akımlar için girdi akımları veya çıktı akımları kullanılırlar. Girdi ve çıktı akımları ikili veri okunacağı ve yazılacağı zaman kullanılırlar. Öte yandan, karakter tabanlı akımlar akımlara karakter yazarlar ve akımlardan karakter okurlar. Okuyucu ve yazıcılar yazı tabanlı girdi ve çıktı (uygun şifreleme ile) kullanıldığı zaman kullanılırlar. Bilginin akış yönüne göre karakter tabanlı akımlar için okuyucular veya yazıcılar kullanılırlar.
Akım sınıfları java.io paketinde gerçekleştirilirler. Bu yüzden akım sınıflarını paket adsız kullanmak için programın en başında aşağıdaki "import" deyimine ihdiyaç duyarsınız:
import java.io.*;