JavaRush /Блоги Java /Random-TG /I/O дар Java. Синфҳо FileInputStream, FileOutputStream, B...

I/O дар Java. Синфҳо FileInputStream, FileOutputStream, BufferedInputStream

Дар гурӯҳ нашр шудааст
Салом! Дар лексияи имрӯза мо сӯҳбатро дар бораи ҷараёнҳои вуруд ва баромад дар Java, ё кӯтоҳ Java I/O («ворид-баромад») идома медиҳем. Ин лексияи аввалин дар ин мавзӯъ нест ва охирин ҳам нахоҳад буд :) Ҳамин тавр мешавад, ки Java ҳамчун забон барои кор бо вуруд/баромад имкониятҳои зиёд фароҳам меорад. Дарсҳои зиёде ҳастанд, ки ин функсияро амалӣ мекунанд, аз ин рӯ мо онҳоро ба якчанд лексияҳо тақсим кардем, то шумо дар аввал ошуфта нашавед :) I/O дар Java.  Синфҳо FileInputStream, FileOutputStream, BufferedInputStream - 1Дар лексияҳои қаблӣ мо ба 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»
I/O дар Java.  Синфҳо FileInputStream, FileOutputStream, BufferedInputStream - 2 Ин аст он чизе ки татбиқи хондани маълумот аз файл бо истифода аз 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 -ро идома медиҳем - ба зудӣ вомехӯрем!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION