JavaRush /Java Blog /Random-TL /I/O sa Java. Mga Klase ng FileInputStream, FileOutputStre...

I/O sa Java. Mga Klase ng FileInputStream, FileOutputStream, BufferedInputStream

Nai-publish sa grupo
Kamusta! Sa lecture ngayon, ipagpapatuloy natin ang pag-uusap tungkol sa input at output stream sa Java, o Java I/O (“input-output”) para sa maikling salita. Hindi ito ang unang lecture sa paksang ito, at hindi ito ang huli :) Nagkataon lang na ang Java bilang isang wika ay nagbibigay ng maraming pagkakataon para magtrabaho sa input/output. Napakaraming klase na nagpapatupad ng functionality na ito, kaya hinati namin ang mga ito sa ilang mga lecture para hindi ka malito sa una :) I/O sa Java.  Mga Klase ng FileInputStream, FileOutputStream, BufferedInputStream - 1Sa mga nakaraang lecture ay hinawakan namin ang BufferedReader , pati na rin ang mga abstract na klase na InputStream & OutputStream at ilang inapo. Ngayon ay titingnan natin ang 3 bagong klase: FileInputStream , FileOutputStream at BufferedInputStream .

klase ng FileOutputStream

Ang pangunahing layunin ng klase ng FileOutputStream ay magsulat ng mga byte sa isang file. Walang kumplikado :) Ang FileOutputStream ay isa sa mga pagpapatupad ng abstract na klase ng OutputStream . Sa constructor, ang mga object ng klase na ito ay dadaan sa landas patungo sa target na file (kung saan kailangang isulat ang mga byte) o isang object ng class File. Tingnan natin ang parehong mga halimbawa:
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();
   }
}
Kapag lumilikha ng isang bagay, Filetinukoy namin sa tagabuo ang landas kung saan ito dapat matatagpuan. Hindi na kailangang likhain ito nang maaga: kung wala ito, lilikha ito mismo ng programa. Magagawa mo nang hindi gumagawa ng dagdag na bagay at magpasa lang ng string na may address:
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();
   }
}
Magiging pareho ang resulta sa parehong mga kaso. Maaari naming buksan ang aming file at makita doon:

Hello! Добро пожаловать на JavaRush — лучший сайт для тех, кто хочет стать программистом!
Gayunpaman, mayroong isang caveat dito. Subukang patakbuhin ang code mula sa halimbawa sa itaas nang maraming beses nang sunud-sunod, at pagkatapos ay tingnan ang file at sagutin ang tanong: ilang linya ang nakikita mong nakasulat dito? Isa lang. Ngunit ilang beses mong pinatakbo ang code. Gayunpaman, lumalabas na ang data ay na-overwrite sa bawat oras, na pinapalitan ang mga luma. Paano kung hindi tayo nasisiyahan dito at kailangan ng sequential recording? Paano kung gusto nating isulat ang ating pagbati sa isang file nang tatlong beses nang sunud-sunod? Simple lang ang lahat dito. Dahil hindi alam ng wika mismo kung anong uri ng pag-uugali ang kailangan namin sa bawat kaso, FileOutputStreammaaari kang magpasa ng karagdagang parameter sa constructor - boolean append. Kung totoo ang value nito , isusulat ang data sa dulo ng file. Kung false (at false ang default na value ), mabubura ang lumang data at isusulat ang bagong data. Subukan at patakbuhin natin ang binagong code nang tatlong beses:
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();
   }
}
Resulta sa file:

Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Isa pang bagay! Isaisip ang feature na ito kapag gumagamit ng mga klase ng I/O. Sa isang pagkakataon, kailangan kong umupo nang maraming oras sa mga gawain upang maunawaan kung saan nagmula ang aking lumang data mula sa mga file :) At siyempre, tulad ng sa kaso ng iba pang mga klase ng I/O, huwag kalimutan ang tungkol sa pagpapalabas ng mga mapagkukunan sa pamamagitan ng close().

klase ng FileInputStream

Ang klase ay may FileInputStreamkabaligtaran na layunin - pagbabasa ng mga byte mula sa isang file. Tulad ng FileOutputStreaminherits OutputStream, ang klase na ito ay nagmula sa abstract na klase InputStream. Sumulat tayo ng ilang linya ng text sa ating text na “ 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 sa Java.  Mga Klase ng FileInputStream, FileOutputStream, BufferedInputStream - 2 Ito ang pagpapatupad ng pagbabasa ng data mula sa isang file gamit ang 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);
       }
   }
}
Binabasa namin ang isang byte mula sa file, i-convert ang mga read byte sa mga character at i-output ang mga ito sa console. At narito ang resulta sa console:

So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters

BufferedInputStream na klase

Sa palagay ko, dahil sa kaalaman mula sa mga nakaraang lektura, madali mong masasabi kung bakit kailangan ang klase BufferedInputStreamat kung ano ang mga pakinabang nito FileInputStream:) Nakilala na natin ang mga buffered stream, kaya subukang hulaan (o tandaan) bago magpatuloy sa pagbabasa :) Mga buffered stream pangunahing kailangan para ma-optimize ang I/O. Ang pag-access sa pinagmumulan ng data, tulad ng pagbabasa mula sa isang file, ay isang operasyong masinsinang pagganap. At ang pag-access sa file upang basahin ang isang byte sa bawat oras ay aksaya. Samakatuwid, BufferedInputStreambinabasa nito ang data hindi isang byte sa isang pagkakataon, ngunit sa mga bloke at pansamantalang iniimbak ang mga ito sa isang espesyal na buffer. Ito ay nagpapahintulot sa amin na i-optimize ang pagpapatakbo ng programa sa pamamagitan ng pagbabawas ng bilang ng mga pag-access sa file. Tingnan natin kung ano ang hitsura nito:
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);
       }
   }
}
Narito kami ay lumikha ng isang bagay BufferedInputStream. Tumatanggap ito ng isang bagay o alinman sa mga kahalili nito bilang input , kaya gagawin InputStreamng nauna . FileInputStreamKinukuha nito ang laki ng buffer sa bytes bilang karagdagang parameter. Ngayon, salamat dito, babasahin ang data mula sa file hindi isang byte sa isang pagkakataon, ngunit 200 sa isang pagkakataon! Isipin kung gaano namin nabawasan ang bilang ng mga pag-access sa file. Upang ihambing ang pagganap, maaari kang kumuha ng ilang malalaking text file na ilang megabytes ang laki at ihambing kung gaano katagal bago ito basahin at i-output ito sa console sa mga millisecond gamit ang FileInputStreamat BufferedInputStream. Narito ang parehong mga halimbawa ng 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()));
   }
}
Kapag nagbabasa ng 1.5 MB na file sa aking computer, FileInputStreamnagawa nito ang trabaho sa ~3500 milliseconds, ngunit dito BufferedInputStreamginawa nito ang trabaho sa ~1700 milliseconds. Gaya ng nakikita mo, na-optimize ng buffered stream ang pagganap ng programa nang 2 beses! :) Patuloy kaming mag-aaral ng mga klase sa I/O - see you soon!
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION