đôi tượng /npwufStream có thê là FilelnputStream.
Ví dụ: dùng DataOutputStream và DatalnputStream để ghi và
đọc những kiểu đữ liệu khác nhau trên file. ImpOFT† Javd.1o. *;
class RWDaf1a
í
public static votd main(Strimng args[ ]) throws IOException
í DafaOufputStream datfaOut; DafaOufputStream datfaOut; DafalnputStream datadln; mí 1 = 10; double d = I1023.56; boolean b = true; fry í
dataOut = new DatfaOMfDutStream(
new FIleOutputStream(”D-Westdata")); ỷ
cafch(IOExceptton exc) 142
Sysfem.out.println( “Cannot open flÌe. "); return; j fry í Syster.ouf.printlm( "Wriing ˆ + 1); dataOut.writelnf(1); Systemr.ouf.primfin( "Wriing ” + đ); dataOut.writelouble(d); Systemr.ouf.primfin( "Wriing ” + b); dataOut.writeBoolean(B);
System.out.printim( "Wrtting ” + I2.2 * 7.4);
dataOut.writelouble(I2.2 * 7.4);
j
cafch(IOExceptton exc)
í
Sysfem.ouft.println( "Write error. ");
j
dataOut.close(); Sysfem.ouf.printlm();
⁄ Now, read them bacĂ. ƒry
(
dataln = new DatalnputStream(
new FilelnputStream(”D:\Westdata "));
j
cafch(IOExceptton exc)
í
Sysfem.out.println( “Cannot open flÌe. "); return;
j
/ry í ¡ = dataln.reqadlmt(); Sysfem.out.printim(“Reading ” + 1); đ = dataln.readDouble(); System.out.printim(“Reading ” + đ); b = dataln.readBoolean(); System.out.printim(“Reading ” + b); đ = dataln.readDouble(); System.out.printim(“Reading ” + đ); j cafch(IOExceptton exc)
(_ System.out.println( “Read error. "); ỷ
dataln.close();
ỷ
Kết quả thực thi chương trình: Dữ liệu ghi xuông file D:\Wtestdata
“II li 0D hi lo : - |H| x|
Fls Erit Fasrmat Haln
HŒ4[1ủzá@ L] [3V °ẽ... LÍ Er ^Í
+ È -
Kêt quả đọc và xuât ra Console:
61 |E:VvIEreatorV3VGE2DDT.exe 18 18 1833.5b †: ru b_ F4: HN.) 123.5
Press an keụ tũ cũntinue. ..
5.4.File truy cập ngẫu nhiên (Random Access Eiles)
Bên cạnh việc xử lý xuất nhập trên file theo kiểu tuần tự
thông qua các luông, java cũng hỗ trợ truy cập ngẫu nhiên nội dung của một ñle nào đó dùng andomAccessFile. RandomAccessFile không dẫn xuật từ InputStream hay OutputSteam mà nó hiện thực các mterface Dafalnput, DafaOwfpuf (có định nghĩa các phương thức ƯO cơ bản).
RandomAccessEile hỗ trợ vân đề định vị con trỏ file bên trong
một file dùng phương thức seek(long newPos).
Ví dụ: minh họa việc truy cập ngẫu nhiên trên file. Chương
trình ghi 6 sô kiêu double xuông file, rôi đọc lên theo thứ tự
ngâu nhiên.
ImpOFT† Javd.1o. *;
class RandomAccessDemo
í
public static votd main(Strimng args[ ]) throws IOException
í double đata[] = {19.4, 10.1, 123.54, 33.0, 87.9, 74.25}; double đata[] = {19.4, 10.1, 123.54, 33.0, 87.9, 74.25}; double đ; RandomAccessFile raƒ; fry í
rafốỒ. = new RandomAccessFile(”D:\Wandom.dat”,
muy" :
j
cafch(FileNotFoundExcepfIon exc)
í
Sysfem.out.println( “Cannot open flÌe. "); return ;
⁄.Write values to the file.
ƒor(imt i1=0; 1 < data.length; Ii++)
í fry fry í raƒ.writeDouble(data[1]); j cafch(IOExceptton exc) í
Sysfem.ouft.printlm( “Error wrlting 1o fle. "); return ;
j j j
fry
í
⁄ Now, reqad back specffc vaÌues raƒ.seek(0); 4 seek to first double d = raƒ.readouble();
Sysferm.oUft.prIntlm{( “FTrst value 1s ” + đ); raƒ.seek(8); 4 seek to second double d = raƒ.readouble();
Sysfem.ouft.printÌm{( “Second valMe 1s ” + đ); raƒ.seek(8 * 3); ⁄/ seek to {ourth double d = raƒ.readouble();
Syste.out.printlm(“Fourth value ts ” + đ); Sysfđ.OUf.prIHIm();
⁄ Now, reqd every other value.
Sysfemt.ouft.printlm( “Here 1s every other valMde: ”);
ƒor(imt =0; 1 < data.length; i+=2) (_ raƒ.seek(S *1); seek to ith double
d = raf.readDouble(); Sysfem.ouf.prim(d + ” ”);
Sysfem.ouf.printlm( NI”); 7 cafch(IOExceptton exc) í 7 raƒ.close();
Sysfem.ouft.printlm( “Error seeking or reqdIng. ");
ỷ
Kết quả thực thi chương trình:
E:vIEreator/3XBE2HIT.ewe First ualue 1s 19.4 kernnd ualue is 10.1 Fouth ualue 1s 33. I1 G03... 08i 0 19.4 123.54 82.9
IS. no: ho. ai:
5.5.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 kiểu character trên luồng.
Mức trên cùng là hai lớp trừu tượng ®eader và Wrirer. Lớp
Reader dùng cho việc nhập dữ liệu của luồng, lớp Wrzzer 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à Wrirer thao tác trên các luông ký tự Unicode.
Những phương thức định nghĩa trong lớp trừu tượng Reader và Writer
Phương thức Ý \ghña
Reader
abstract void cÏlose( ) Đóng luông
void mark(int nunChars) Đá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 rmark() không?
im† read( ) Đọc một ký tự
immt read(char buƒƒfer† ]) Đọc buffer.length ký tự cho vào bufer
abstract Int read(char
bujJer[ Ì,
In† Oƒfset,
imm† nưnChars)
Đọc numChhars ký tự cho vào
vùng đệm buffer tại vị trí buffer[offset]
boolean readly( ) Kiêm tra xem luông có đọc được
không?
void resef( ) Dời con trỏ nhập đến vị trí đánh dâu trước đó
long skip(long nunChars) Bỏ qua numChars của luông nhập
Writer
abstract void cÏlose( ) Đóng luông xuât. Có lỗi ném ra IOException
abstract vold ƒÏush( ) Dọn dẹp luông (buffer xuât)