JavaRush /Java блогы /Random-KK /Java тілінде енгізу/шығару. FileInputStream, FileOutputSt...

Java тілінде енгізу/шығару. FileInputStream, FileOutputStream, BufferedInputStream сыныптары

Топта жарияланған
Сәлеметсіз бе! Бүгінгі дәрісте біз Java тіліндегі кіріс және шығыс ағындары немесе қысқаша Java I/O («енгізу-шығару») туралы әңгімені жалғастырамыз. Бұл осы тақырыптағы бірінші лекция емес және соңғысы да болмайды :) Java тілі ретінде енгізу/шығарумен жұмыс істеу үшін көптеген мүмкіндіктер беретіні солай. Бұл функционалдылықты жүзеге асыратын көптеген сыныптар бар, сондықтан сіз алдымен шатастырмау үшін оларды бірнеше дәрістерге бөлдік :) Алдыңғы дәрістерде біз BufferedReader , сонымен қатар InputStream & OutputStream абстрактілі сыныптары және бірнеше тақырыпты Java тілінде енгізу/шығару.  FileInputStream, FileOutputStream, BufferedInputStream сыныптары - 1қозғадық. ұрпақтары. Бүгін біз 3 жаңа сыныпты қарастырамыз: FileInputStream , FileOutputStream және BufferedInputStream .

FileOutputStream сыныбы

FileOutputStream класының негізгі мақсаты файлға byteтарды жазу болып табылады. Ештеңе күрделі емес :) FileOutputStream абстрактілі OutputStream класының іске асырылуының бірі болып табылады . Конструкторда осы сыныптың нысандары мақсатты файлға жолды (byteтар жазылуы керек) немесе сыныптың нысанын алады 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біз конструкторда оның орналасуы керек жолды көрсетеміз. Оны алдын ала жасаудың қажеті жоқ: ол жоқ болса, бағдарлама оны өзі жасайды. Сіз қосымша нысан жасамай-ақ жасай аласыз және мекен-жайы бар жолды жібере аласыз:
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 болса ), ескі деректер жойылады және жаңа деректер жазылады. Өзгертілген 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 - лучший сайт для тех, кто хочет стать программистом!
Басқа іс! Енгізу/шығару сыныптарын пайдалану кезінде осы мүмкіндікті есте сақтаңыз. Бір кездері менің ескі деректерімнің файлдардан қайда кеткенін түсіну үшін тапсырмаларды орындауға бірнеше сағат отыруға тура келді :) Және, әрине, басқа енгізу/шығару сыныптарындағы сияқты, 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 тілінде енгізу/шығару.  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:) Біз буферленген ағындарды кездестірдік, сондықтан оқуды жалғастырмас бұрын болжап көріңіз (немесе есте сақтаңыз) :) Буферленген ағындар ең алдымен енгізу/шығаруды оңтайландыру үшін қажет. Деректер көзіне қатынасу, мысалы, файлдан оқу, өнімділікті қажет ететін операция болып табылады. Әр жолы бір 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. Ол нысанды немесе оның кез келген мұрагерін input ретінде қабылдайды 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