Salam! Şu günki leksiýamyzda Java-da giriş we çykyş akymlary ýa-da gysgaça Java I / O (“giriş-çykyş”) baradaky söhbetdeşligi dowam etdireris . Bu mowzuk boýunça ilkinji leksiýa däl we iň soňky bolmaz :) Diňe bir dil hökmünde Java giriş / çykyş bilen işlemek üçin köp mümkinçilik döredýär. Bu funksiýany durmuşa geçirýän synplar gaty köp, şonuň üçin ilki başda bulaşmazlyk üçin olary birnäçe leksiýa böldük :) Öňki leksiýalarda BufferedReader , şeýle hem InputStream & OutputStream we abstrakt sapaklar barada durup geçdik. nesilleri. Bu gün 3 sany täze synpa serederis: FileInputStream , FileOutputStream we BufferedInputStream .
FileOutputStream synpy
FileOutputStream synpynyň esasy maksady bir faýla baýt ýazmakdyr. Çylşyrymly zat ýok :) FileOutputStream abstrakt OutputStream synpynyň durmuşa geçirişlerinden biridir . Konstruktorda bu synpyň obýektleri ýa-da nyşan faýlyna (baýt ýazylmaly) ýa-da synpyň obýektine gidýärFile
. Iki mysala seredeliň:
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();
}
}
Obýekt döredilende, File
konstruktoryň nirede bolmalydygyny kesgitledik. Öňünden döretmegiň zerurlygy ýok: eger ýok bolsa, programma ony özi döreder. Goşmaça obýekt döretmezden edip bilersiňiz we diňe salgy bilen bir setir geçirip bilersiňiz:
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();
}
}
Iki ýagdaýda-da netije birmeňzeş bolar. Faýlymyzy açyp, şol ýerde görüp bileris:
Hello! Добро пожаловать на JavaRush — лучший сайт для тех, кто хочет стать программистом!
Şeýle-de bolsa, bu ýerde bir gowak bar. Aboveokardaky mysaldan kody yzly-yzyna birnäçe gezek işledip görüň, soňra faýla serediň we soraga jogap beriň: içinde näçe setir ýazylandygyny görýärsiňizmi? Diňe bir. Theöne kody birnäçe gezek işlediň. Şeýle-de bolsa, maglumatlaryň köne maglumatlary çalşyp, her gezek gaýtadan ýazylandygy ýüze çykýar. Munuň bilen kanagatlanmasak we yzygiderli ýazga mätäç bolsak näme etmeli? Salamlarymyzy bir faýla yzly-yzyna üç gezek ýazmak islesek näme etmeli? Bu ýerde hemme zat ýönekeý. Diliň özi her ýagdaýda haýsy gylyk-häsiýetiň gerekdigini bilip bilmeýänligi sebäpli, FileOutputStream
konstruktora goşmaça parametr geçirip bilersiňiz - boolean append
. Onuň bahasy dogry bolsa , maglumatlar faýlyň ahyryna ýazylar. Falsealňyş bolsa (we asyl bahasy ýalňyş bolsa ), köne maglumatlar öçüriler we täze maglumatlar ýazylar. Üýtgedilen kodumyzy üç gezek synap göreliň:
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();
}
}
Netije:
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Başga bir zat! I / O sapaklaryny ulananyňyzda bu aýratynlygy ýatda saklaň. Bir wagtlar köne maglumatlarymyň faýllardan nirä gidenine düşünmek üçin birnäçe sagatlap oturmaly bolýardym :) Elbetde, beýleki I / O synplarynda bolşy ýaly, çeşmeleriň üsti bilen goýbermegi ýatdan çykarmaň close()
.
FileInputStream synpy
SynpyňFileInputStream
ters maksady bar - faýldan baýt okamak. FileOutputStream
Miras ýaly OutputStream
, bu synp abstrakt synpdan alýar InputStream
. “ Test.txt ” tekstimize birnäçe setir tekst ýazalyň:
«So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters»
Faýldan maglumatlary okamagyň ýerine ýetirilişi şu 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);
}
}
}
Faýldan bir baýt okaýarys, okalýan baýtlary nyşanlara öwürýäris we konsola çykarýarys. Ine, konsolyň netijesi:
So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters
BufferedInputStream synpy
Öňki leksiýalardan alnan bilimleri göz öňünde tutup, synpyň näme üçin zerurdygynyBufferedInputStream
we haýsy artykmaçlyklarynyň bardygyny aňsatlyk bilen aýdyp bilersiňiz FileInputStream
:) Biz eýýäm buferlenen akymlar bilen duşuşdyk, şonuň üçin okamagy dowam etdirmezden ozal çaklamaga synanyşyň :) Buferli akymlar ilki bilen I / O-ny optimizirlemek üçin zerurdyr. Faýldan okamak ýaly maglumat çeşmesine girmek, öndürijilikli iş. Her gezek bir baýt okamak üçin faýla girmek isripdir. Şonuň üçin BufferedInputStream
maglumatlary bir gezekde bir baýt däl-de, bloklarda okaýar we wagtlaýynça ýörite buferde saklaýar. Bu, faýla giriş sanyny azaltmak arkaly programmanyň işini optimizirlemäge mümkinçilik berýär. Görnüşine seredeliň:
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);
}
}
}
Bu ýerde bir obýekt döretdik BufferedInputStream
. Bir obýekti ýa-da mirasdüşerleriniň haýsydyr birini giriş hökmünde kabul edýär InputStream
, şonuň üçin öňküsi FileInputStream
kabul eder. Bufer ölçegini goşmaça parametr hökmünde baýtda alýar. Indi munuň netijesinde maglumatlar faýldan bir gezekde bir baýt däl-de, bir gezekde 200 okalar! Faýl girişleriniň sanyny näçe azaldandygymyzy göz öňüne getiriň. Öndürijiligi deňeşdirmek üçin birnäçe megabaýt ululykdaky uly tekst faýly alyp, ony okamagyň we millisekuntda konsolda näçe wagt gerekdigini deňeşdirip FileInputStream
bilersiňiz BufferedInputStream
. Ine, koduň iki mysaly:
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()));
}
}
Kompýuterimde 1.5 MB faýly okanymda, FileInputStream
bu işi 3500 millisekuntda ýerine ýetirdi, ýöne bu ýerde BufferedInputStream
bu işi 1700 millisekuntda ýerine ýetirdi. Görşüňiz ýaly, buferlenen akym programmanyň işini 2 esse optimallaşdyrdy! :) I / O sapaklaryny öwrenmegi dowam etdireris - soňrak görüşeris!
GO TO FULL VERSION