CodeGym /Java Blog /यादृच्छिक /Java मध्ये इनपुट/आउटपुट. FileInputStream, FileOutputStrea...
John Squirrels
पातळी 41
San Francisco

Java मध्ये इनपुट/आउटपुट. FileInputStream, FileOutputStream आणि BufferedInputStream वर्ग

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
"हाय! आजच्या धड्यात, आम्ही जावा ( Java I/O ) मधील इनपुट आणि आउटपुट प्रवाहांबद्दल आमचे संभाषण सुरू ठेवू. हा या विषयावरील पहिला धडा नाही आणि तो नक्कीच शेवटचा नाही :) Java मध्ये इनपुट/आउटपुट.  FileInputStream, FileOutputStream, आणि BufferedInputStream वर्ग - 1तसे असे होते, जावा भाषा 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"
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); 

       } 
   } 
}
आम्ही फाइलमधून एक बाइट वाचतो, वाचलेल्या बाइट्सचे अक्षरांमध्ये रूपांतर करतो आणि कन्सोलवर प्रदर्शित करतो. आणि येथे कन्सोल आउटपुट आहे:

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 वर्गांचा अभ्यास सुरू ठेवू — लवकरच भेटू!
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION