Chương 5. THAO TÁC VỚI FILE
5.4. Sử dụng luồng ký tự
Chúng ta đã tìm hiểu và sử dụng luồng byte để xuất/nhập dữ liệu. Tuy có thể nhưng trong một số trường họp luồng byte không phải là cách “lý tưởng” đế quản lýxuất nhập dữ liệu kiểu character, vì vậy Java đã đưa ra kiểu luồng character phục vụ cho việc xuất nhập dữ liệu kieucharactertrênluồng.
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 của 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.
Những phương thức định nghĩa tronglóp trừu tượng Reader:
- abstract void close(): đóng luồng.
- void mark(int numChars): đánh dấu vịtrí hiện tại trên luồng.
- boolean markSupported(): kiểm tra xem luồng có hỗ trợ thao tác đánh dấu mark() không.
-int read(): đọc một kỷ tự.
-intread(char buffer[ ]): đọc buffer.length ký tự cho vào buffer.
- abstract int read(char buffer[ ], int offset, int numChars): đọc numChars ký tự cho vào vùng đệm buffer tại vị trí buffer [offset],
- boolean ready(): kiểm tra xem luồng có đọc đuợc không.
- void resetQ: dời con trỏ nhập đến vị trí đánh dấu truớc đó.
- long skip(long numChars): bò quanumChars của luồng nhập.
Những phuơng thức định nghĩa trong lóp trừu tượng Writer:
- abstract void close(): đóng luồng xuất. Có lỗi ném ra lOException.
- abstract void flush(): dọn dẹp luồng (buffer xuất).
- void write(intch): ghi một kýtự.
- void write(byte buffer[]): ghi một mảng các ký tự.
- abstract void write(charbuffer[ ], intoffset, int numChars): ghi mộtphầncủa mảng ký tự.
- void write(String str): ghi một chuỗi.
- void write(String str,int offset, int numChars): ghi một phần của một chuỗi ký tự.
5.4.1. Nhập Console dùng luồng ký tự
Thường thì việc nhập dữ liệu từ Console dùng luồng ký tự thì thuận lợi hơn dùng luồng byte. Lóp tốt nhấtđể đọc dữ liệu nhập từ Console là lóp BufferedReader. Tuy nhiên, chúng ta không thể xây dựng một lóp BufferedReader trực tiếp từ System.in. Thay vào đó chúng ta phải chuyển nó thành một luồng ký tự. Đe làm điều này chúng ta dùng InputStreamReader chuyểnbyte thành ký tự.
Đe có được một đối tượng InputStreamReader gắn với System,in, ta dùng phương thức khởi tạo của InputStreamReader.
InputStreamReader(InputStream inputstream).
Tiếp theo dùng đối tuợng InputStreamReader đã tạo ra để tạo ra một BufferedReader dùng phương thức khởi tạo củaBufferedReader.
BufferedReader(Reader inputReader).
Ví dụ: Tạo một BufferedReader gắn với Keyboard:
BufferedReaderbr= new BufferedReaderfnew InputStreamReader(System.in));
Sau khi thực hiện câu lệnh trên, br là một luồng ký tự gắn với Console thông qua System.in.
Ví dụ: Dùng BufferedReader đọc từng ký tự từ Console. Việc đọc kết thúc khi gặp dấu chấm (dấu chấm để kết thúc chương trình).
Chương trình 5.7 import java.io.*; class Readchars {
public static void mainfString args[]J throws lOException {
char c;
BufferedReaderbr= newBufferedReaderf new InputStreamReader(System.in));
System.out.printlnf'Nhap chuôiky tu, gioi han dau cham.");
// read characters do
{
c = (char) br.readQ;
System.out.println(c);
}whilefc != '.’)/
} }
Kết quả thực hiện chương trình:
Nhap chuoi ky tu, gioi han dau cham.
Chuông 5. Thao tacvoi tep c
h u
0
n g 5
Ví dụ: Dùng BufferedReader đọc chuỗi ký tự từ Console. Chương trình kết thúc khi gặp chuỗi đọc là chuỗi“stop”:
Chương trình 5.8 import java.io.*;
class ReadLines {
public static void main(String args[]) throws lOException {
// createa BufferedReaderusing System.in BufferedReader br =new BufferedReaderfnew InputStreamReader(System.in));
String str;
System.out.printlnf'Nhap chuoi.");
System.out.printlnf'Nhap 'stop' ket thucchuông trinh.");
do {
str= br.readLineQ;
System.out.println(str);
}while(!str.equals("stop"));
} }
Kết quả thực hiện chương trình:
Nhap chuoi.
Nhap 'stop' ket thuc chuông trinh.
Lap trinhJava Lap trinhJava stop
stop
5.4.2. Xuất Console dùng luồng ký tự
Trong ngôn ngữ Java, bên cạnh việc dùng System.out để xuất dữ liệu ra Console (thường dùng đế debug chương trình), chúng ta có thế dùng luồng Printwriter đối với các chương trình “chuyên nghiệp”. Printwriter là một trong những lớp luồng ký tự. Việc dùng các lóp luồng kýtự đế xuất dữ liệuraConsole thường được “ưa chuộng” hơn.
Đe xuất dữ liệu ra Console bang Printwriter cần thiết phải chỉ định System.out cho luồng xuất.
Ví dụ: Tạo đối tượng Printwriter để xuất dữ liệu ra Console:
Printwriter pw = newPrintWriterfSystem.out, true);
Ví dụ: Minh họa dùngPrintwriterđểxuất dữ liệu ra Console:
Chươ ngtrình 5.9 import java.io.*;
public class PrintWriterDemo {
public static void mainfString args[]) {
Printwriter pw =newPrintWriterfSystem.out, true);
inti = 10;
doubled = 123.67;
double r = i + d;
pw.printlnf'Using a Printwriter.");
pw.println(i);
pw.println(d);
pw.printlnfi + " + " + d+ " = " + r);
} }
Kết quả thực hiện chương trình:
Using a Printwriter.
10 123.67
10 + 123.67 = 133.67000000000002 5.4.3. Đọc/ghi file dùng luồng ký tự
Thôngthường đế đọc/ghi file,người ta thường dùng luồng byte, nhưng đốivới luồng ký tự chúng ta cũng có thế thực hiện được. Ưu điếm của việc dùng luồng ký tự là chúng thao tác trực tiếp trên các ký tự Unicode. Vì vậy, luồng ký tự là chọn lựa tốt nhấtkhi cần lưu những văn bản Unicode.
Hai lớp luồng thường dùng cho việc đọc/ghi dữ liệukýtựxuống file là FileReader và FileWriter.
Ví dụ: Đọc những dòng văn bản nhập từ bàn phím và ghi chúng xuống file tên là
“test.txt”. Việc đọc và ghi kết thúc khi người dùng nhập vào chuỗi “stop”.
Chương trình 5.10 import java.io.*; class KtoD
{
public static voidmain(Stringargs[]) throws lOException {
String str;
FileWriter fw;
BufferedReader br =newBufferedReaderf new InputStreamReader(System.in));
try {
fw = newFileWriter("F:\\test.txt");
}
catch(IOExceptionexc) {
System.out.println("Khong the mo file.");
return;
}
System.out.println("Nhap ('stop' de ket thuc chuông trinh).");
do {
System.out.printf':");
str= br.readLinef);
if(str.compareTo("stop") == 0) break;
str= str + "\r\n";
fw. write (str);
}while(str.compareTo("stop") != 0);
fw.close();
} }
Kết quả thực hiện chương trình:
Dữ liệu nhập từConsole:
Nhap ('stop' de ket thuc chuông trinh).
: Lap trinh Java
: Chuông trinh minh hoa doc/ghi file : Ghi dulieu nhap tu ban phim xuong file : stop
Dữ liệughi xuống file F:\\test.txt
Ví dụ: đọc và hiến thị nội dung của file “test.txt” lên màn hình.
Chương trình 5.11 import java.io.*; class DtoS {
public static void mainfString args[]J throws Exception {
FileReaderfr= new FileReader("F:\\test.txt");
BufferedReaderbr = new BufferedReader(fr);
Strings;
while((s = br.readLineQ) != null) {
System.out.println(s);
}
fr.closeQ;
} }
Kết quả thực hiện chương trình:
Kết quả đọc file và hiển thị ra Console:
LaptrinhJava