?
- ? bài này, chúng ta s? cùng nhau làm quen v?i khái ni?m lu?ng (streams) và file. Công vi?c này nó thu?c 1 ph?n c?a x? lý các lu?ng.
T? ?ó chúng ta bi?t các làm cho ch??ng trình có th? ??c, ghi d? li?u trong b? nh? l?u tr?, sau này còn có th? liên quan t?i cách x? lý, trao ??i d? li?u thông qua các k?t n?i m?ng!
1, Lu?ng (Streams)
a, Khái ni?m lu?ng
- Vi?c nh?p xu?t d? li?u trong th?c t? r?t ?a d?ng. Nh?p d? li?u có th? là t? bàn phím, t? trên m?ng, máy scan, camera, .v.v..v. Xu?t d? li?u có th? là ghi ra b? nh?, in ra màn hình, máy in, ..v..v.. Nh?ng ho?t ??ng ?ó ???c g?i chung l?i 1 khái ni?m g?i là lu?ng (stream). Lu?ng là n?i có th? s?n xu?t và tiêu th? thông tin.
- Trong l?p trình Java, lu?ng th??ng ???c h? th?ng xu?t nh?p g?n k?t v?i m?t thi?t b? v?t lý. Th?c t? có r?t nhi?u các thi?t b? v?t lý khác nhau, nh?ng các lu?ng l?i có cùng 1 nguyên t?c gi?ng nhau ?? chúng ta d? dàng x? lý. Vì v?y cùng m?t l?p, ph??ng th?c xu?t nh?p có th? dùng chung cho các thi?t b? v?t lý khác nhau. Ví d? cùng là m?t ph??ng th?c có th? dùng ??
ghi d? li?u ra console, ??ng th?i c?ng có th? dùng ?? ghi d? li?u xu?ng m?t file trên ??a. Java hi?n th?c lu?ng b?ng t?p h?p các l?p phân c?p trong gói java.io.
- Java ??nh ngh?a 2 ki?u lu?ng: byte và ký t? (phiên b?n g?c ch? ??nh ngh?a ki?u lu?ng byte, và sau ?ó lu?ng ký t? ???c thêm vào trong các phiên b?n v? sau).
- Lu?ng ký t? ???c thi?t k? h? tr? vi?c nh?p xu?t d? li?u ki?u ký t? (Unicode). Trong m?t vài tr??ng h?p lu?ng ký t? s? d?ng hi?u qu? h?n lu?ng byte, nh?ng ? m?c h? th?ng thì t?t c? nh?ng xu?t nh?p ??u ph?i qui v? byte. Lu?ng ký t? h? tr? hi?u qu? ch? ??i v?i vi?c qu?n lý, x? lý các ký t?.
b, Lu?ng byte (Byte Streams)
- Các lu?ng byte ???c ??nh ngh?a dùng hai l?p phân c?p. M?c trên cùng là hai l?p tr?u t??ng InputStream và OutputStream. InputStream ??nh ngh?a nh?ng ??c ?i?m chung cho nh?ng lu?ng nh?p byte. OutputStream mô t? cách x? lý c?a các lu?ng xu?t byte.
- Các l?p con d?n xu?t t? hai l?p InputStream và OutputStream s? h? tr? chi ti?t t??ng ?ng v?i vi?c ??c ghi d? li?u trên nh?ng thi?t b? khác nhau. Có r?t nhi?u các l?p khác nhau, nh?ng khi b?n ?ã n?m v?ng, s? d?ng thành th?o m?t lu?ng byte nào ?ó thì b?n s? d? dàng làm vi?c v?i nh?ng lu?ng còn l?i nhanh thôi!
c, Lu?ng ký t? (Character Streams)
- Các lu?ng ký t? ???c ??nh ngh?a dùng hai l?p phân c?p. M?c trên cùng là hai l?p tr?u t??ng Reader và Writer.
- L?p Reader dùng cho vi?c nh?p d? li?u c?a lu?ng, l?p Writer dùng cho vi?c xu?t d? li?u cua lu?ng. Nh?ng l?p d?n xu?t t? Reader và Writer thao tác trên các lu?ng ký t? Unicode.
d, Nh?ng lu?ng ???c ??nh ngh?a tr??c (The Predefined Streams)
- T?t c? các ch??ng trình vi?t b?ng java luôn t? ??ng import gói java.lang. Gói này có ??nh ngh?a l?p System, bao g?m m?t s? ??c ?i?m c?a môi tr??ng run-time, nó có ba bi?n lu?ng ???c ??nh ngh?a tr??c là in, out và err, các bi?n này là các fields ???c khai báo static trong l?p System.
- System.out: lu?ng xu?t chu?n, m?c ??nh là console.
System.out là m?t ??i t??ng ki?u PrintStream.
- System.in: lu?ng nh?p chu?n, m?c ??nh là bàn phím.
System.in là m?t ??i t??ng ki?u InputStream.
- System.err: lu?ng l?i chu?n, m?c ??nh c?ng là console.
System.out c?ng là m?t ??i t??ng ki?u PrintStream
gi?ng System.out.
2, S? d?ng lu?ng Byte
- Nh? chúng ta ?ã bi?t hai l?p InputStream và OutputStream là các l?p cha ??i v?i t?t c? nh?ng l?p lu?ng xu?t nh?p ki?u byte. Nh?ng ph??ng th?c trong hai l?p cha này ném ra các l?i ki?u IOException. Nh?ng ph??ng th?c ??nh ngh?a trong 2 l?p cha này là có th? dùng trong các l?p con c?a chúng. Vì v?y t?p các ph??ng th?c ?ó là t?p t?i ti?u các ch?c n?ng nh?p xu?t mà nh?ng lu?ng nh?p xu?t ki?u byte có th? s? d?ng.
- Nh?ng ph??ng th?c ??nh ngh?a trong l?p InputStream và OutputStream:
a, ??c d? li?u t? Console
Tr??c ?ây, khi Java m?i ra ??i ?? th?c hi?n vi?c nh?p d? li?u t? Console ng??i ta ch? dùng lu?ng nh?p byte. V? sau thì chúng ta có th? dùng c? lu?ng byte và lu?ng ký t?, nh?ng trong m?t s? tr??ng h?p th?c t? ?? ??c d? li?u t? Console ng??i ta thích dùng lu?ng ki?u ký t? h?n, vì lý do ??n gi?n và d? b?o trì ch??ng trình. ? ?ây v?i m?c ?ích minh h?a chúng ta dùng lu?ng byte th?c hi?n vi?c nh?p xu?t Console.
Ví d?: Ch??ng trình minh h?a vi?c ??c m?t m?ng bytes t? System.in
PHP:
package javaandroidvn;
import java.io.IOException;
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
byte duLieu[] = new byte[100];
System.out.print("Nh?p dòng ký t? vào: ");
System.in.read(duLieu);
System.out.print("Dòng ký t? v?a nh?p: ");
for (int i = 0; i < duLieu.length; i++) {
System.out.print((char) duLieu[i]);
}
}
}- T??ng t? nh? nh?p d? li?u t? Console, v?i phiên b?n ??u tiên c?a java ?? xu?t d? li?u ra Console t? ch? có th? s? d?ng lu?ng byte. K? t? phiên b?n 1.1 (có thêm lu?ng ký t?), ?? xu?t d? li?u ra Console có th? s? d?ng c? lu?ng ký t? và lu?ng byte. Tuy nhiên, cho ??n nay ?? xu?t d? li?u ra Console th??ng ng??i ta v?n dùng lu?ng byte.
- Chúng ta ?ã khá quen thu?c v?i ph??ng th?c print() và println(), dùng ?? xu?t d? li?u ra Console. Bên c?nh ?ó chúng ta c?ng có th? dùng ph??ng th?c write().
Ví d?: S? d?ng ph??ng th?c System.out.write() ?? xu?t ký t? x và m?ng ký t? ch[] ra Console
PHP:
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
char ch[] = {a, c, d, e};
int b;
b = x;
System.out.write(b);
System.out.write( );
for (int i = 0; i < ch.length; i++) {
System.out.write(ch[i]);
}
System.out.write( );
}
}