Luồng vào ra trong Java hay Input/Output (I/O) trong java được sử dụng để xử lý đầu vào và đầu ra trong java.
Java sử dụng khái niệm Stream để làm cho hoạt động I/O nhanh hơn.
Stream là một dòng liên tục, có thứ tự các bytes dữ liệu chảy giữa chương trình và thiết bị ngoại vi.
Đối với Java, các thiết bị chỉ nhập như bàn phím sẽ có Stream nhập nối với nó, các thiết bị chỉ xuất như màn hình sẽ có Stream xuất nối với nó, các thiết bị như đĩa từ sẽ có cả 2 Stream nhập và Stream xuất nối với nó.
Để giao tiếp với thiết bị ngoại vi, chương trình trước tiên phải lấy được Stream nhập/ Stream xuất gắn với thiết bị ngoại vi này. Sau đó chương trình sẽ gởi dữ liệu ra thiết bị ngoại vi bằng thao tác ghi (write) vào Stream xuất của thiết bị ngoại vi.
Ngược lại, chương trình có thể nhận dữ liệu từ thiết bị ngoại vi bằng thao tác đọc (read) Stream nhập của thiết bị ngoại vi đó. Nói cách khác, chương trình chỉ làm việc trên các Stream nhập và Stream xuất của thiết bị ngoại vi mà không cần quan tâm đến đặc điểm riêng biệt của thiết bị ngoại vi.
Gói java.io chứa tất cả các lớp cần thiết cho hoạt động input và output của Stream.
Các luồng byte Java được sử dụng để thực hiện input và output của byte 8-bit. Có nhiều lớp liên quan đến các luồng byte nhưng các lớp này được dẫn đầu bởi 2 class InputStream và OutputStream:
Hoạt động của của Java OutputStream và InputStream được mô tả trong hình dưới đây.
Luồng Java Byte được sử dụng để thực hiện input và output của byte 8-bit, trong khi các luồng ký tự được sử dụng để thực hiện input và output cho unicode 16 bit. Có nhiều lớp liên quan đến các luồng ký tự nhưng các lớp này được dẫn đầu bởi 2 class Reader và Writer: