JavaRush /Java блогу /Random-KY /Java ичинде I/O. FileInputStream, FileOutputStream, Buffe...

Java ичинде I/O. FileInputStream, FileOutputStream, BufferedInputStream класстары

Группада жарыяланган
Салам! Бүгүнкү лекцияда биз Java, же кыскача Java I/O («киргизүү-чыгаруу») киргизүү жана чыгаруу агымдары жөнүндө сүйлөшүүнү улантабыз. Бул бул темадагы биринчи лекция эмес жана акыркысы да болбойт :) Java тor катары киргизүү/чыгарма менен иштөө үчүн көптөгөн мүмкүнчүлүктөрдү берет. Бул функцияны ишке ашырган бир топ класстар бар, андыктан сиз адегенде адашып калбашыңыз үчүн аларды бир нече лекцияларга бөлдүк :) Мурунку лекцияларда биз BufferedReader , ошондой эле InputStream & OutputStream абстракттуу класстары жана бир нече сабактарга Java ичинде I/O.  FileInputStream, FileOutputStream, BufferedInputStream класстары - 1токтолдук. урпактары. Бүгүн биз 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();
   }
}
Объектти түзүүдө 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 (жана демейки маани false болсо ), эски маалыматтар өчүрүлөт жана жаңы маалыматтар жазылат. Өзгөртүлгөн codeубузду үч жолу текшерип, иштетели:
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»
Java ичинде I/O.  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Менимче, мурунку лекциялардагы бorмдерди эске алуу менен, класс эмне үчүн керек экенин жана анын кандай артыкчылыктары бар экенин оңой эле айта аласыз 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, андыктан мурункусу FileInputStreamкабыл алат. Бул кошумча параметр катары byte менен буфер өлчөмүн алат. Эми мунун аркасында маалыматтар файлдан бир byte эмес, бир эле учурда 200 byte окулат! Элестеткиле, биз файлга кирүүлөрдүн санын канчалык азайттык. Майнаптуулукту салыштыруу үчүн, бир нече мега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