CodeGym /Java Blog /Random /Input/output sa Java. Mga klase ng FileInputStream, FileO...
John Squirrels
Antas
San Francisco

Input/output sa Java. Mga klase ng FileInputStream, FileOutputStream, at BufferedInputStream

Nai-publish sa grupo
"Kumusta! Sa aralin ngayon, ipagpapatuloy natin ang ating pag-uusap tungkol sa mga input at output stream sa Java ( Java I/O ). Hindi ito ang unang aralin sa paksang ito, at tiyak na hindi ito ang huli :) Input/output sa Java.  Mga klase ng FileInputStream, FileOutputStream, at BufferedInputStream - 1Tulad nito Nangyayari, ang wikang Java ay nagbibigay ng maraming mga paraan upang gumana sa I/O. Mayroong ilang mga klase na nagpapatupad ng pagpapaandar na ito, kaya hinati namin ang mga ito sa ilang mga aralin — para hindi ka malito sa simula :) Noong nakaraan mga aralin, binanggit namin ang BufferedReader, gayundin ang InputStreamat OutputStreamabstract na mga klase at ilang mga inapo. Ngayon ay isasaalang-alang namin ang 3 bagong klase: FileInputStream,  FileOutputStream, at  BufferedInputStream.

Ang klase ng FileOutputStream

Ang pangunahing layunin ng FileOutputStreamklase ay magsulat ng mga byte sa isang file. Walang kumplikado :) FileOutputStreamay isa sa mga pagpapatupad ng OutputStreamabstract na klase. Sa constructor, ang mga bagay ng klase na ito ay kukuha ng alinman sa landas patungo sa target na file (kung saan dapat isulat ang mga byte) o isang Filebagay. Susuriin namin ang mga halimbawa ng bawat isa:

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 CodeGym — The best site for would-be programmers!"; 

       fileOutputStream.write(greetings.getBytes()); 
       fileOutputStream.close(); 
   } 
}
Kapag lumilikha ng Filebagay, naipasa namin ang nais na landas patungo sa tagabuo. Hindi namin kailangang likhain ito nang maaga: kung wala ito, lilikha ito ng program. Maaari ka ring magtagumpay nang hindi gumagawa ng dagdag na bagay, pagpasa lamang ng isang string na may landas:

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 CodeGym — The best site for would-be programmers!"; 

       fileOutputStream.write(greetings.getBytes()); 
       fileOutputStream.close(); 
   } 
} 
Magiging pareho ang resulta sa parehong mga kaso. Maaari naming buksan ang aming file at makita ang sumusunod doon:

Hi! Welcome to CodeGym — The best site for would-be programmers!
Ngunit mayroong isang nuance dito. Subukang patakbuhin ang code mula sa halimbawa sa itaas nang maraming beses sa isang hilera. Pagkatapos ay tumingin sa file at sagutin ang tanong na ito: ilang linya mayroon ito? Isa lang. Ngunit ilang beses mong pinatakbo ang code. Lumalabas na ang data ay na-overwrit sa bawat oras — ang luma ay pinapalitan ng bago. Ano ang gagawin namin kung hindi iyon angkop sa amin at kailangan naming sumulat nang sunud-sunod sa file? Paano kung gusto nating isulat ang ating pagbati sa isang file nang tatlong beses nang sunud-sunod? Napakasimple ng lahat. Dahil hindi alam ng wika kung anong pag-uugali ang kailangan natin sa bawat kaso, ang FileOutputStreamcontrucutor ay maaaring kumuha ng karagdagang parameter —boolean append. Kung totoo ang halaga nito, isusulat ang data sa dulo ng file. Kung ito ay mali (at bilang default ito ay mali), ang anumang lumang data ay mabubura at papalitan ng bagong data. Suriin natin ito sa pamamagitan ng pagpapatakbo ng aming 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 CodeGym — The best site for would-be programmers!\r\n"; 

       fileOutputStream.write(greetings.getBytes()); 
       fileOutputStream.close(); 
   } 
} 
Mga nilalaman ng file:

Hi! Welcome to CodeGym — The best site for would-be programmers! 
Hi! Welcome to CodeGym — The best site for would-be programmers! 
Hi! Welcome to CodeGym — The best site for would-be programmers!
Ngayon ay iba na! Huwag kalimutan ang tungkol sa tampok na ito kapag gumagamit ng mga klase ng I/O. May oras na gumugol ako ng maraming oras sa mga gawain, nag-rack sa utak ko ng maraming oras, sinusubukang unawain kung paano nawawala ang data ko sa mga file :) At siyempre, tulad ng ibang mga klase sa I/O, huwag kalimutang gamitin ang close()pamamaraan sa libreng mapagkukunan.

Ang klase ng FileInputStream

Ang FileInputStreamay may kabaligtaran na layunin - pagbabasa ng mga byte mula sa isang file. Tulad ng FileOutputStreaminherits OutputStream, ang klase na ito ay nagmula sa InputStreamabstract na klase. Magsusulat kami ng ilang linya ng text sa aming " test.txt " file:

"So close no matter how far 
Couldn't be much more from the heart 
Forever trusting who we are 
And nothing else matters"
Input/output sa Java.  Mga klase ng FileInputStream, FileOutputStream, at BufferedInputStream - 2Narito kung ano ang hitsura 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 ipinapakita ang mga ito sa console. At narito ang output ng console:

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

Ang klase ng BufferedInputStream

Sa palagay ko, dahil sa kaalaman mula sa mga nakaraang aralin, madali mong masasabi kung bakit kailangan natin ang BufferedInputStreamklase at kung ano ang mga pakinabang nito kumpara sa FileInputStream:) Nakatagpo na tayo ng mga buffered stream, kaya subukang hulaan (o tandaan) bago ka magpatuloy sa pagbabasa :) Pangunahing kailangan ang mga buffered stream para ma-optimize ang I/O. Ang pag-access sa isang mapagkukunan ng data, tulad ng pagbabasa mula sa isang file, ay isang mamahaling operasyon sa mga tuntunin ng pagganap At ang pag-access ng isang file upang basahin ang bawat byte ay aksaya. Iyon ang dahilan kung bakit BufferedInputStreamnagbabasa ng data hindi isang byte sa isang pagkakataon, ngunit sa mga bloke, at pansamantalang iniimbak ang mga ito sa isang espesyal na buffer. Nagbibigay-daan ito sa amin na i-optimize ang program sa pamamagitan ng pagbabawas ng bilang ng beses na na-access namin ang 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); 
       } 
   } 
} 
Dito lumikha kami ng isang BufferedInputStreambagay. Ang tagabuo nito ay kumukuha ng isang halimbawa ng InputStreamklase o alinman sa mga inapo nito, gayon din FileInputStreamang gagawin. Bilang karagdagang argumento, kinakailangan ang laki ng buffer sa mga byte. Salamat sa argumentong ito, babasahin na ngayon ang data mula sa file hindi isang byte sa isang pagkakataon, ngunit 200 byte sa isang pagkakataon! Isipin kung gaano namin nabawasan ang bilang ng mga pag-access sa file. Upang ihambing ang pagganap, maaari kang kumuha ng isang malaking text file (ilang megabytes ng text) at ihambing kung gaano katagal ang aabutin sa millisecond upang basahin at i-output sa console gamit ang FileInputStreamat BufferedInputStream. Narito ang code na nagpapakita ng parehong mga opsyon:

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, FileInputStreamnakumpleto ang gawain sa ~3500 millisecond, ngunit BufferedInputStreampinamamahalaan ito sa ~1700 millisecond. Tulad ng nakikita mo, na-optimize ng buffered stream ang trabaho, pinutol ito sa kalahati! :) 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