"हाय! आजच्या धड्यात, आम्ही जावा ( Java I/O ) मधील इनपुट आणि आउटपुट प्रवाहांबद्दल आमचे संभाषण सुरू ठेवू. हा या विषयावरील पहिला धडा नाही आणि तो नक्कीच शेवटचा नाही :) तसे असे होते, जावा भाषा I/O सह कार्य करण्याचे अनेक मार्ग प्रदान करते. या कार्यक्षमतेची अंमलबजावणी करणारे बरेच वर्ग आहेत, म्हणून आम्ही त्यांना अनेक धड्यांमध्ये विभागले आहे — जेणेकरून तुम्ही सुरुवातीपासून गोंधळात पडणार नाही :) भूतकाळात धडे, आम्ही स्पर्श केला
BufferedReader
, तसेच InputStream
आणि OutputStream
अमूर्त वर्ग आणि अनेक वंशज. आज आपण 3 नवीन वर्गांचा विचार करू: FileInputStream
, FileOutputStream
, आणि BufferedInputStream
.
फाइलआउटपुटस्ट्रीम वर्ग
FileOutputStream
फाईलवर बाइट्स लिहिणे हा वर्गाचा मुख्य उद्देश आहे. काहीही क्लिष्ट नाही :) अमूर्त वर्गाच्या FileOutputStream
अंमलबजावणीपैकी एक आहे OutputStream
. कन्स्ट्रक्टरमध्ये, या वर्गातील ऑब्जेक्ट्स एकतर टार्गेट फाइलचा मार्ग (जिथे बाइट्स लिहिल्या पाहिजेत) किंवा 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 CodeGym — The best site for would-be programmers!";
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 CodeGym — The best site for would-be programmers!";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
दोन्ही प्रकरणांमध्ये निकाल सारखाच असेल. आम्ही आमची फाईल उघडू शकतो आणि तेथे खालील पाहू शकतो:
Hi! Welcome to CodeGym — The best site for would-be programmers!
पण इथे एक बारकावे आहे. वरील उदाहरणावरून कोड सलग अनेक वेळा चालवण्याचा प्रयत्न करा. मग फाइल पहा आणि या प्रश्नाचे उत्तर द्या: त्यात किती ओळी आहेत? फक्त एक. पण तुम्ही कोड अनेक वेळा रन केला. असे दिसून आले की डेटा प्रत्येक वेळी ओव्हरराईट केला जातो — जुन्याची जागा नवीनद्वारे घेतली जाते. जर ते आम्हाला पटत नसेल आणि आम्हाला फाइलवर क्रमाने लिहायचे असेल तर आम्ही काय करावे? एका फाईलवर सलग तीन वेळा शुभेच्छा लिहायच्या असतील तर? हे सर्व खूप सोपे आहे. प्रत्येक बाबतीत आपल्याला कोणत्या वर्तनाची आवश्यकता आहे हे भाषेला कळत नसल्यामुळे, कॉन्ट्रक्यूटर FileOutputStream
अतिरिक्त पॅरामीटर घेऊ शकतो —boolean append
. त्याचे मूल्य खरे असल्यास, डेटा फाइलच्या शेवटी लिहिला जाईल. जर ते खोटे असेल (आणि डीफॉल्टनुसार ते खोटे असेल), कोणताही जुना डेटा मिटविला जाईल आणि नवीन डेटाद्वारे बदलला जाईल. आमचा सुधारित कोड तीन वेळा चालवून हे तपासूया:
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();
}
}
फाइल सामग्री:
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!
आता ते वेगळे! I/O वर्ग वापरताना या वैशिष्ट्याबद्दल विसरू नका. एक वेळ अशी होती जेव्हा मी तासनतास कामात घालवायचे, तासनतास माझ्या मेंदूला रॅक करत, माझा डेटा फाइल्समधून कसा गायब होत आहे हे समजून घेण्याचा प्रयत्न केला :) आणि अर्थातच, इतर I/O वर्गांप्रमाणे, पद्धत वापरण्यास विसरू नका close()
. मुक्त संसाधनांसाठी.
फाइलइनपुटस्ट्रीम वर्ग
याचाFileInputStream
उलट उद्देश आहे - फाईलमधून बाइट्स वाचणे. 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"
वापरून फाइलमधील डेटा वाचणे कसे दिसते ते येथे आहे 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);
}
}
}
आम्ही फाइलमधून एक बाइट वाचतो, वाचलेल्या बाइट्सचे अक्षरांमध्ये रूपांतर करतो आणि कन्सोलवर प्रदर्शित करतो. आणि येथे कन्सोल आउटपुट आहे:
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
:) आम्हाला आधीच बफर प्रवाहांचा सामना करावा लागला आहे, म्हणून वाचन सुरू ठेवण्यापूर्वी अंदाज लावण्याचा (किंवा लक्षात ठेवण्याचा) प्रयत्न करा :) बफर केलेले प्रवाह प्रामुख्याने I/O ऑप्टिमाइझ करण्यासाठी आवश्यक आहेत. फाईलमधून वाचण्यासारख्या डेटा स्त्रोतामध्ये प्रवेश करणे, कार्यक्षमतेच्या दृष्टीने एक महाग ऑपरेशन आहे आणि प्रत्येक बाइट वाचण्यासाठी फाइलमध्ये प्रवेश करणे व्यर्थ आहे. म्हणूनच BufferedInputStream
डेटा एका वेळी एक बाइट नाही तर ब्लॉक्समध्ये वाचतो आणि तात्पुरता विशेष बफरमध्ये संग्रहित करतो. हे आपल्याला फाईल ऍक्सेस करण्याची संख्या कमी करून प्रोग्राम ऑप्टिमाइझ करू देते. हे कसे दिसते ते पाहूया:
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);
}
}
}
येथे आपण एक BufferedInputStream
ऑब्जेक्ट तयार केला आहे. InputStream
त्याचा कन्स्ट्रक्टर वर्ग किंवा त्याच्या कोणत्याही वंशजाचा दाखला घेतो , तसे FileInputStream
करेल. अतिरिक्त युक्तिवाद म्हणून, ते बफर आकार बाइट्समध्ये घेते. या युक्तिवादाबद्दल धन्यवाद, डेटा आता फाईलमधून एका वेळी एक बाइट नाही तर एका वेळी 200 बाइट वाचला जाईल! कल्पना करा की आम्ही फाइल ऍक्सेसची संख्या किती कमी केली आहे. FileInputStream
कार्यप्रदर्शनाची तुलना करण्यासाठी, तुम्ही एक मोठी मजकूर फाईल (अनेक मेगाबाइट मजकूर) घेऊ शकता आणि आणि वापरून कन्सोल वाचण्यासाठी आणि आउटपुट करण्यासाठी मिलिसेकंदांमध्ये किती वेळ लागतो याची तुलना करू शकता BufferedInputStream
. येथे कोड आहे जो दोन्ही पर्याय प्रदर्शित करतो:
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 MB फाइल वाचताना, FileInputStream
~3500 मिलीसेकंदमध्ये काम पूर्ण केले, परंतु BufferedInputStream
ते ~1700 मिलीसेकंदमध्ये व्यवस्थापित केले. जसे आपण पाहू शकता, बफर केलेल्या प्रवाहाने काम ऑप्टिमाइझ केले, ते अर्धे कापले! :) आम्ही I/O वर्गांचा अभ्यास सुरू ठेवू — लवकरच भेटू!
GO TO FULL VERSION