Dasturlarda juda ko'p hollarda ma'lumotlarni faylga yoki boshqa manbalarga tez yozish talabi mavjud. Va bunday hollarda savol tug'iladi: nimani ishlatish kerak, qaysi klassni tanlash kerak? Bugun biz ushbu rolda mos "nomzodlardan" biri - BufferedWriter klassi bilan tanishamiz.
BufferedWriter nima uchun kerak
BufferedWriter – bu klass, buferlangan belgilarni oqimga yozadi. Bu fizika vositasiga murojaat qilinadigan ma'lumotlar miqdorini kamaytirishga imkon beradi. Ya'ni, har safar alohida belgini yozmasdan, bu ma'lumotlarni buferga yozadi, shundan keyin – barcha bu belgilarni manbaga yozadi.
Bu ma'lumotlarni yozish tezligini sezilarli darajada oshiradi. Mahfiy bufer hajmi 8192 belgilardir, lekin bu ko'rsatkichni konstruktorida yangi hajmni belgilab o'zgartirish mumkin:
BufferedWriter(Writter in, int sz)
Bu erda konstruktorda birinchi argument – bu yozilish bo'ladigan oqim, qabul qiluvchi. A sz – bu aynan yangi bufer hajmini aniqlashdir.
Bundan tashqari, Javada yana BufferedReader klassi mavjud: u ma'lumotlarni buferlangan holda o'qish uchun ishlatiladi.
Umuman olganda, bufer nima ekanligi haqida hayotiy misolda tushunaylik. Bufer – bu supermarketdagi savat yoki arava kabi. Mahsulotni olib, kassaga olib borib, to'lash, avtomobil bagajiga qo'yish va keyin yangi narsalarni olish o'rniga, arava olib, kerakli narsalarni qo'yib, kassaga to'laymiz. Xuddi shunday bufer ham ishlaydi: u sizning ma'lumotlaringizni yig'ib, keyin hammasini oladi va yozadi, har bir qismini alohida yozish o'rniga.
BufferedWriter klassi konstruktorlari va metodlari
Endi BufferedWriter klassini batafsil ko'rib chiqaylik. Ob'ekt yaratish uchun ikki konstruktor mavjud:
public BufferedWriter(Writer out)
public BufferedWriter(Writer out, int sz)
Bu erda out har ikkala konstruktorlarda – yozish manbasi, a sz, oldin aytib o'tilgani kabi, – bu bufer hajmi.
Shuningdek, BufferedWriter klassida bir qancha metodlar mavjud. Ulardan ba'zilari bugun batafsil ko'rib chiqiladi:
| write(char[] array) | char massivni buferga yozish |
| write(String s, int off, int len) | Stringning bir qismini buferga yozish |
| append(char c) | Belgini buferga yozish |
| append(CharSequence csq, int start, int end) | Massivning bir qismini buferga yozish |
| newLine() | Qatorni ajratish |
| flush() | oqimni tozalash |
Faylga qiymatlarni yozadigan dastur yozamiz. Writer ob'ekti sifatida konstruktorga FileWriter beramiz. Bu yuklovchi fayllarni yozish uchun ishlatiladi va ob'ektlarni ishga tushirish uchun bir necha konstruktorlarga ega:
FileWriter(File file, boolean append)
FileWriter(FileDescriptor fd)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)
Bizning misolimiz uchun fayl nomini oladigan konstruktorni ishlatamiz:
try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
String message = "Salom Amigo! Bu juda muhim xabar!";
bufferedWriter.write(message);
bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
}
Kodimiz write(String str) metodidan foydalanib, str xabarlarini file.txt fayliga yozadi.
Yozish uchun boshqa metodlar mavjud:
write(char[] array) – char-larning massivini qabul qiladi va yozadi;
write(String s, int off, int len) – satrni s qabul qiladi, off – satr belgilarining indeksi, undan yozish boshlanadi, va len – yoziladigan satr (qo'shimcha satr) uzunligi.
try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
String message = "Salom, Amigo! Bu juda muhim xabar!";
bufferedWriter.write(message, 0, 12);
bufferedWriter.flush();
}catch(IOException ex){
System.out.println(ex.getMessage());
}
Bu kod faylga quyidagini yozadi: “Salom, Amig”, chunki biz 0 indeksdan boshlab 12 belgini yozishni ko'rsatdik.
Kodimizda yana try-with resources mavjud:
try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt")))
Bu shuni anglatadi, bufferedWriter ob'ekti uchun close() metodi avtomatik ravishda chaqiriladi, chunki u AutoCloseable interfeysini amalga oshiradi.
Koddagi flush() metodi chiqish oqimini tozalash va barcha buferlangan baytlarni yozish uchun ishlatiladi. Ushbu metodni chaqirmasdan, yozish amalga oshmasligi mumkin, chunki u buferni tozalash va undagi baytlarni yozish kerakligini ko'rsatadi.
Bundan tashqari, BufferedWriter klassida newLine() deb nomlangan metod mavjud, bu bizning xabarimizga yangi qator qo'shadi:
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
String message = "Salom, Amigo! Bu juda muhim xabar!";
bufferedWriter.write(message, 0, 14);
bufferedWriter.newLine();
bufferedWriter.write(message, 15, 27);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
Faylda biz quyidagini olamiz:
Bu juda muhim xabar!
append() metodining imzosi quyidagicha:
public Writer append(CharSequence csq, int start, int end)
csq qo'shish uchun ishlatiladi. Bu yerda start – bu birinchi belgining indeksi, a end – bu satrning oxirgi belgisining indeksi (qushilgan satr), oxirgi belgi qo'shilmaydi.
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
String message = "Salom Amigo! Bu juda muhim xabar!";
bufferedWriter.append(message, 0, 7);
bufferedWriter.flush();
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
Ushbu kodni ishga tushirsang, sen quyidagini olasan:
Ya'ni append metodi yordamida sen satrning qaysi qismiga buferga qo'shishni ko'rsatasan.
Agar write() va append() o'rtasidagi farqni ko'rib chiqadigan bo'lsak, ular asosan bir xil vazifani bajaradi: qiymatlar yozish.
Lekin farq shundaki, append metodi yanada yangi va CharSequence argumentini qabul qiladi, va String – bu CharSequenceni amalga oshirishi bo'lganligi uchun appendga String, StringBuilder, va StringBufferni qo'shish mumkin. Biroq write() metodiga faqat String ni qo'yish mumkin.
Bu hammasi! Bugun biz bufer bilan tanishdik, faylga buferlangan yozish qanday amalga oshiriladi, va bu uchun foydalanish mumkin bo'lgan metodlar bilan tanishdik.
GO TO FULL VERSION