Mục lục
InputStream là một abstract class đại diện cho một luồng dữ liệu đầu vào dạng byte có thứ tự. Hay nói cách khác bạn có thể đọc dữ liệu từ InputStream theo một chuỗi byte có thứ tự. Điều này sẽ có ích khi bạn đọc dữ liệu từ file hoặc nhận dữ liệu qua mạng.
InputStream subclass
InputStream class là một abstract class đại diện cho một luồng dữ liệu đầu vào dạng bytes, tất cả các class con kế thừa từ InputStream class đều có các mục đích sử dụng riêng biệt:
- ByteArrayInputStream
- FileInputStream
- PipedInputStream
- BufferedInputStream
- FilterInputStream
- PushbackInputStream
- DataInputStream
- ObjectInputStream
- SequenceInputStream
Ví dụ InputStream
InputStream được sử dụng để đọc dữ liệu dạng byte tại mỗi thời điểm chỉ đọc một byte. Dưới đây là một ví dụ về đọc dữ liệu từ file text dạng byte sử dụng FileInputStream là một subclass thừa kế từ InputStream.
InputStream inputstream = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); int data = inputstream.read(); while(data != -1) { //do something with data... doSomethingWithData(data); data = inputstream.read(); } inputstream.close();
read()
Method read() trong InputStream trả về giá trị int chứa giá trị của byte đọc được.
int data = inputstream.read();
Method read() sau mỗi lần gọi sẽ lưu lại vị trí nó đọc đến trong stream(luồng dữ liệu), ở lần gọi tiếp theo nó sẽ đọc đến byte kế tiếp kể từ vị trí đã được lưu từ lần trước, cứ lặp lại như vậy cho đến khi read() trả về -1 báo hiệu đã đọc đến byte cuối cùng.
int data = inputStream.read(); while(data != -1) { // do something with data variable data = inputStream.read(); // read next byte }
Các subclass của InputStream có thể mở rộng method read() bằng nhiều method khác nhau để phục vụ cho nhiều mục đích khác. Ví dụ là DataInputStream là một subclass của InputStream cung cấp các method để đọc các kiểu dữ liệu khác nhau như là readBoolean(), readDouble() etc.
read(byte[])
InputStream chứa hai method read() đọc byte từ InputStream vào mảng
- int read(byte[])
- int read(byte[], int offset, int length)
read(byte[]) sẽ cố gắng đọc nhiều byte nhất có thể với khoảng sức chứa của mảng byte truyền vào. Trong trường hợp sức chứa của mảng byte truyền vào lớn hơn số lượng byte đọc được thì phần trống còn lại của mảng sẽ chứa data được lặp lại bắt đầu từ vị trí đầu tiên.
read(byte[], int offset, int length) hoạt động tương tự như trên tuy nhiên nó sẽ bắt đầu đọc từ vị trí offset và đọc nhiều nhất là length byte.
read() method trả về int tương ứng với số lượng byte đã được đọc, trả về -1 nếu đã đọc hết dữ liệu từ InputStream.
InputStream inputstream = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); byte[] data = new byte[1024]; int bytesRead = inputstream.read(data); while(bytesRead != -1) { doSomethingWithData(data, bytesRead); bytesRead = inputstream.read(data); } inputstream.close();
End Stream
Nếu read() method trả về -1 thì giá trị cuối cùng trong stream đã được đọc. Giá trị -1 là giá trị kết thúc stream chứ không phải là một byte giá trị trong stream vì thế bạn phải loại bỏ -1 ra khỏi kết quả nhận được.
Hiệu suất của InputStream
Đễ thấy rằng nếu chúng ta đọc dữ liệu theo mảng sẽ nhanh hơn đọc từng byte tại một thời điểm. Vì vậy nên sử dụng read(byte[]) hơn là read() single.
Đóng InputStream
Chúng ta phải đóng kết nối đến InputStream khi đã hoàn tất việc đọc dữ liệu. Để đóng kết nối gọi close() method.
InputStream inputstream = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); int data = inputstream.read(); while(data != -1) { data = inputstream.read(); } inputstream.close();
Convert InputStream sang Reader
Nếu InputStream đọc dữ liệu theo byte thì Reader đọc dữ liệu theo character, để convert InputStream sang Reader chúng ta có thể làm như sau
InputStream inputStream = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); Reader inputStreamReader = new InputStreamReader(inputStream);
Nguồn tham khảo: