Салом! Дар лексияи имрӯза мо сӯҳбатро дар бораи ҷараёнҳои вуруд ва баромад дар Java, ё кӯтоҳ Java I/O («ворид-баромад») идома медиҳем. Ин лексияи аввалин дар ин мавзӯъ нест ва охирин ҳам нахоҳад буд :) Ҳамин тавр мешавад, ки Java ҳамчун забон барои кор бо вуруд/баромад имкониятҳои зиёд фароҳам меорад. Дарсҳои зиёде ҳастанд, ки ин функсияро амалӣ мекунанд, аз ин рӯ мо онҳоро ба якчанд лексияҳо тақсим кардем, то шумо дар аввал ошуфта нашавед :) Дар лексияҳои қаблӣ мо ба BufferedReader , инчунин дарсҳои абстрактии InputStream & OutputStream ва якчанд лексияҳо дахл карда будем. авлоди. Имрӯз мо 3 синфи навро дида мебароем: FileInputStream , FileOutputStream ва BufferedInputStream .
Синфи FileOutputStream
Мақсади асосии синфи FileOutputStream навиштани byteҳо ба файл мебошад. Ҳеҷ чиз мураккаб нест :) FileOutputStream яке аз татбиқи синфи абстрактии OutputStream мебошад . Дар конструктор an objectҳои ин синф ё роҳи файли мавриди ҳадафро (ба он byteҳо бояд навишта шаванд) ё an objectи синфро мегирандFile
. Биёед ҳарду мисолро дида бароем:
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\Username\\Desktop\\test.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
Ҳангоми сохтани an object, File
мо дар конструктор роҳеро, ки бояд дар куҷо ҷойгир шавад, муайян кардем. Онро пешакӣ эҷод кардан лозим нест: агар он вуҷуд надошта бошад, барнома онро худаш эҷод мекунад. Шумо метавонед бидуни сохтани an objectи иловагӣ кор кунед ва танҳо як сатрро бо суроға гузаронед:
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt");
String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
Натиҷа дар ҳарду ҳолат яксон хоҳад буд. Мо метавонем файли худро кушоем ва дар он ҷо бубинем:
Hello! Добро пожаловать на JavaRush — лучший сайт для тех, кто хочет стать программистом!
Бо вуҷуди ин, дар ин ҷо як огоҳӣ вуҷуд дорад. Кӯшиш кунед, ки codeи мисоли дар боло овардашударо якчанд маротиба пай дар пай иҷро кунед ва сипас ба файл нигаред ва ба савол ҷавоб диҳед: шумо дар он чанд сатр навишташударо мебинед? Танҳо як. Аммо шумо якчанд маротиба codeро иҷро кардед. Аммо маълум мешавад, ки маълумот хар дафъа аз нав навишта шуда, ба чои маълумоти кухна. Чӣ мешавад, агар мо бо ин қаноатманд набошем ва ба сабти пайдарпай ниёз дорем? Чӣ мешавад, агар мо хоҳем, ки саломи худро ба файл се маротиба пай дар пай нависем? Дар ин ҷо ҳама чиз оддӣ аст. Азбаски худи забон наметавонад бидонад, ки дар ҳар як ҳолат ба мо чӣ гуна рафтор лозим аст, FileOutputStream
шумо метавонед параметри иловагиро ба конструктор интиқол диҳед - boolean append
. Агар арзиши он true бошад , маълумот то охири файл навишта мешавад. Агар нодуруст бошад (ва арзиши пешфарз false бошад ), маълумоти кӯҳна тоза карда мешавад ва маълумоти нав навишта мешавад. Биёед рамзи тағирёфтаи худро се маротиба санҷем ва иҷро кунем:
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt", true);
String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!\r\n";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
Натиҷа дар файл:
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Чизи дигар! Ҳангоми истифодаи синфҳои I/O ин хусусиятро дар хотир нигоҳ доред. Дар як вақт, ба ман лозим омад, ки соатҳо дар рӯи вазифаҳо нишинам, то бифаҳмам, ки маълумоти кӯҳнаи ман аз файлҳо куҷо рафтааст :) Ва албатта, ба мисли дарсҳои дигари I/O, дар бораи озод кардани захираҳо тавассути close()
.
Синфи FileInputStream
СинфFileInputStream
ҳадафи муқобил дорад - хондани byteҳо аз файл. Мисли FileOutputStream
мерос OutputStream
, ин синф аз синфи абстрактӣ бармеояд InputStream
. Биёед ба матни худ “ test.txt ” чанд сатри матн нависем:
«So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters»
Ин аст он чизе ки татбиқи хондани маълумот аз файл бо истифода аз FileInputStream
:
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");
int i;
while((i=fileInputStream.read())!= -1){
System.out.print((char)i);
}
}
}
Мо аз файл як byteро мехонем, byteҳои хондашударо ба аломатҳо табдил медиҳем ва онҳоро ба консол мебарорем. Ва ин аст натиҷа дар консол:
So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters
Синфи BufferedInputStream
Ман фикр мекунам, бо назардошти донишҳои лексияҳои қаблӣ, шумо метавонед ба осонӣ бигӯед, ки чаро синф лозим астBufferedInputStream
ва он аз он чӣ бартарият дорад FileInputStream
:) Мо аллакай бо ҷараёнҳои буферӣ вохӯрдаем, бинобар ин пеш аз идомаи хондан кӯшиш кунед, ки тахмин кунед (ё дар хотир доред) :) Ҷараёни буферӣ пеш аз ҳама барои оптимизатсияи I/O заруранд. Дастрасӣ ба манбаи додаҳо, ба монанди хондан аз файл, як амалиёти пуршиддат аст. Ва дастрасӣ ба файл барои хондани як byte ҳар дафъа беҳуда аст. Аз ин рӯ, BufferedInputStream
он маълумотро на як byte, балки дар блокҳо мехонад ва онҳоро муваққатан дар буфери махсус нигоҳ медорад. Ин ба мо имкон медиҳад, ки кори барномаро тавассути кам кардани шумораи дастрасӣ ба файл оптимизатсия кунем. Биёед бубинем, ки он чӣ гуна аст:
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream, 200);
int i;
while((i = bufferedInputStream.read())!= -1){
System.out.print((char)i);
}
}
}
Дар ин ҷо мо an object сохтаем BufferedInputStream
. Он an object ё ягон вориси онро ҳамчун вуруд қабул мекунад InputStream
, аз ин рӯ an objectи қаблӣ FileInputStream
ин корро мекунад. Он андозаи буферро дар byte ҳамчун параметри иловагӣ мегирад. Акнун, ба шарофати ин, маълумот аз файл на як byte, балки дар як вақт 200 хонда мешавад! Тасаввур кунед, ки мо шумораи дастрасии файлҳоро чӣ қадар кам кардем. Барои муқоисаи иҷроиш, шумо метавонед як файли калони матниро бо андозааш чанд мегаbyte гиред ва муқоиса кунед, ки барои хондан ва баровардани он ба консол дар миллисонияҳо бо истифода аз FileInputStream
ва чӣ қадар вақт лозим аст BufferedInputStream
. Дар ин ҷо ҳарду намунаи code ҳастанд:
public class Main {
public static void main(String[] args) throws IOException {
Date date = new Date();
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\textBook.rtf");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
int i;
while((i = bufferedInputStream.read())!= -1){
System.out.print((char)i);
}
Date date1 = new Date();
System.out.println((date1.getTime() - date.getTime()));
}
}
public class Main {
public static void main(String[] args) throws IOException {
Date date = new Date();
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\26951280.rtf");
int i;
while((i = fileInputStream.read())!= -1){
System.out.print((char)i);
}
Date date1 = new Date();
System.out.println((date1.getTime() - date.getTime()));
}
}
Ҳангоми хондани файли 1,5 МБ дар компютери ман, FileInputStream
он корро дар ~3500 миллисония анҷом дод, аммо дар ин ҷо BufferedInputStream
он корро дар ~1700 миллисония анҷом дод. Тавре ки шумо мебинед, ҷараёни буферӣ иҷрои барномаро 2 маротиба оптимизатсия кард! :) Мо омӯзиши дарсҳои I/O -ро идома медиҳем - ба зудӣ вомехӯрем!
GO TO FULL VERSION