हम इस ट्यूटोरियल में सीखने वाले है कि जावा फाइल एंड इनपुट ऑउटपुट (Java Files and Input Output) और हम इसे कैसे इस्तमाल कर सकते हैं? Java.io पैकेज में लगभग हर वर्ग शामिल है जिसे आपको जावा में इनपुट और आउटपुट (I/O) करने की आवश्यकता हो सकती है। ये सभी धाराएँ एक इनपुट स्रोत और एक आउटपुट Destination का प्रतिनिधित्व करती हैं। Java.io पैकेज में स्ट्रीम कई डेटा जैसे प्रिमिटिव, ऑब्जेक्ट, स्थानीय वर्ण आदि का समर्थन करती है।
Table of Contents
धारा (Stream in Hindi)
एक Stream को डेटा के अनुक्रम के रूप में परिभाषित किया जा सकता है। Streams दो प्रकार की होती हैं –
- InPutStream − InputStream का उपयोग किसी स्रोत से डेटा पढ़ने के लिए किया जाता है।
- OutPutStream − OutputStream का उपयोग डेस्टिनेशन पर डेटा लिखने के लिए किया जाता है।
जावा फाइलों और नेटवर्क से संबंधित I/O के लिए मजबूत लेकिन लचीला समर्थन प्रदान करता है लेकिन यह ट्यूटोरियल स्ट्रीम और I/O से संबंधित बहुत ही बुनियादी कार्यक्षमता को कवर करता है। हम सबसे अधिक उपयोग किए जाने वाले उदाहरणों को एक-एक करके देखेंगे –
बाइट स्ट्रीम (Byte Streams in Hindi)
जावा बाइट स्ट्रीम का उपयोग 8-बिट बाइट्स के इनपुट और आउटपुट को करने के लिए किया जाता है। हालाँकि बाइट स्ट्रीम से संबंधित कई वर्ग हैं, लेकिन सबसे अधिक उपयोग की जाने वाली कक्षाएं हैं, FileInputStream और FileOutputStream। निम्नलिखित एक उदाहरण है जो एक इनपुट फ़ाइल को आउटपुट फ़ाइल में कॉपी करने के लिए इन दो वर्गों का उपयोग करता है –
Example
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(“input.txt”);
out = new FileOutputStream(“output.txt”);
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
अब निम्न सामग्री के साथ एक फ़ाइल input.txt लेते हैं –
This is test for copy file.
अगले चरण के रूप में, उपरोक्त प्रोग्राम को compiled करें और इसे निष्पादित करें, जिसके परिणामस्वरूप आउटपुट.txt फ़ाइल उसी सामग्री के साथ बनाई जाएगी जो हमारे पास input.txt में है। तो चलिए उपरोक्त कोड को CopyFile.java फ़ाइल में डालते हैं और निम्न कार्य करते हैं –
$javac CopyFile.java
$java CopyFile
चरित्र धाराएँ (Character Streams in Hindi)
जावा बाइट स्ट्रीम का उपयोग 8-बिट बाइट्स के इनपुट और आउटपुट को करने के लिए किया जाता है, जबकि जावा कैरेक्टर स्ट्रीम का उपयोग 16-बिट यूनिकोड के लिए इनपुट और आउटपुट करने के लिए किया जाता है। हालाँकि कैरेक्टर स्ट्रीम से संबंधित कई वर्ग हैं, लेकिन सबसे अधिक उपयोग की जाने वाली कक्षाएं हैं, FileReader और FileWriter। हालाँकि आंतरिक रूप से FileReader FileInputStream का उपयोग करता है और FileWriter FileOutputStream का उपयोग करता है, लेकिन यहाँ प्रमुख अंतर यह है कि FileReader एक समय में दो बाइट्स पढ़ता है और FileWriter एक बार में दो बाइट्स लिखता है।
हम उपरोक्त उदाहरण को फिर से लिख सकते हैं, जो एक इनपुट फ़ाइल (unicode characters) को आउटपुट फ़ाइल में कॉपी करने के लिए इन दो वर्गों का उपयोग करता है –
Example
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader(“input.txt”);
out = new FileWriter(“output.txt”);
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
अब निम्न सामग्री के साथ एक फ़ाइल input.txt लेते हैं –
This is test for copy file.
अगले चरण के रूप में, उपरोक्त प्रोग्राम को compiled करें और इसे निष्पादित करें, जिसके परिणामस्वरूप आउटपुट.txt फ़ाइल उसी सामग्री के साथ बनाई जाएगी जो हमारे पास input.txt में है। तो चलिए उपरोक्त कोड को CopyFile.java फ़ाइल में डालते हैं और निम्न कार्य करते हैं –
$javac CopyFile.java
$java CopyFile
मानक धाराएँ (Standard Streams in Hindi)
सभी प्रोग्रामिंग भाषाएँ मानक I/O के लिए समर्थन प्रदान करती हैं जहाँ उपयोगकर्ता का प्रोग्राम कीबोर्ड से इनपुट ले सकता है और फिर कंप्यूटर स्क्रीन पर आउटपुट उत्पन्न कर सकता है। यदि आप C या C++ प्रोग्रामिंग भाषाओं के बारे में जानते हैं, तो आपको तीन मानक उपकरणों STDIN, STDOUT और STDERR के बारे में पता होना चाहिए। इसी तरह, जावा निम्नलिखित तीन मानक धाराएँ प्रदान करता है –
- Standard Input − इसका उपयोग उपयोगकर्ता के प्रोग्राम को डेटा फीड करने के लिए किया जाता है और आमतौर पर एक कीबोर्ड का उपयोग मानक इनपुट स्ट्रीम के रूप में किया जाता है और इसे System.in के रूप में दर्शाया जाता है।
- Standard Output − इसका उपयोग उपयोगकर्ता के प्रोग्राम द्वारा उत्पादित डेटा को आउटपुट करने के लिए किया जाता है और आमतौर पर एक कंप्यूटर स्क्रीन का उपयोग मानक आउटपुट स्ट्रीम के लिए किया जाता है और इसे System.out के रूप में दर्शाया जाता है।
- Standard Error − इसका उपयोग उपयोगकर्ता के प्रोग्राम द्वारा उत्पादित त्रुटि डेटा को आउटपुट करने के लिए किया जाता है और आमतौर पर एक कंप्यूटर स्क्रीन का उपयोग मानक त्रुटि स्ट्रीम के लिए किया जाता है और इसे System.err के रूप में दर्शाया जाता है।
निम्नलिखित एक सरल प्रोग्राम है, जो उपयोगकर्ता द्वारा “q” टाइप करने तक मानक इनपुट स्ट्रीम पढ़ने के लिए InputStreamReader बनाता है –
Example
import java.io.*;
public class ReadConsole {
public static void main(String args[]) throws IOException {
InputStreamReader cin = null;
try {
cin = new InputStreamReader(System.in);
System.out.println(“Enter characters, ‘q’ to quit.”);
char c;
do {
c = (char) cin.read();
System.out.print(c);
} while(c != ‘q’);
}finally {
if (cin != null) {
cin.close();
}
}
}
}
आइए उपरोक्त कोड को ReadConsole.java फ़ाइल में रखें और इसे निम्न प्रोग्राम में दिखाए अनुसार compiled और निष्पादित करने का प्रयास करें। जब तक हम ‘q’ दबाते हैं, तब तक यह प्रोग्राम उसी वर्ण को पढ़ना और आउटपुट करना जारी रखता है –
$javac ReadConsole.java
$java ReadConsole
Enter characters, ‘q’ to quit.
1
1
e
e
q
q
फ़ाइलें पढ़ना और लिखना (Reading and Writing Files)
जैसा कि पहले बताया गया है, एक धारा को डेटा के अनुक्रम के रूप में परिभाषित किया जा सकता है। InputStream का उपयोग किसी स्रोत से डेटा पढ़ने के लिए किया जाता है और OutputStream का उपयोग Destination पर डेटा लिखने के लिए किया जाता है।
यहाँ इनपुट और आउटपुट स्ट्रीम से निपटने के लिए कक्षाओं का एक पदानुक्रम है।
दो महत्वपूर्ण धाराएँ FileInputStream और FileOutputStream हैं, जिनकी चर्चा इस ट्यूटोरियल में की जाएगी।
FileInputStream
इस स्ट्रीम का उपयोग फाइलों से डेटा पढ़ने के लिए किया जाता है। नए कीवर्ड का उपयोग करके ऑब्जेक्ट बनाए जा सकते हैं और कई प्रकार के कंस्ट्रक्टर उपलब्ध हैं।
फ़ाइल को पढ़ने के लिए एक इनपुट स्ट्रीम ऑब्जेक्ट बनाने के लिए निम्नलिखित कंस्ट्रक्टर एक फ़ाइल नाम को एक स्ट्रिंग के रूप में लेता है –
InputStream f = new FileInputStream(“C:/java/hello”);
फ़ाइल को पढ़ने के लिए एक इनपुट स्ट्रीम ऑब्जेक्ट बनाने के लिए निम्नलिखित कंस्ट्रक्टर एक फ़ाइल ऑब्जेक्ट लेता है। पहले हम फ़ाइल () विधि का उपयोग करके एक फ़ाइल ऑब्जेक्ट बनाते हैं –
File f = new File(“C:/java/hello”);
InputStream f = new FileInputStream(f);
एक बार आपके पास इनपुटस्ट्रीम ऑब्जेक्ट हाथ में हो जाने के बाद, सहायक Methods की एक सूची होती है जिसका उपयोग स्ट्रीम पर पढ़ने या स्ट्रीम पर अन्य संचालन करने के लिए किया जा सकता है।
Sr.No. | Method & Description |
1 | public void close() throws IOException{}यह विधि फ़ाइल आउटपुट स्ट्रीम को बंद कर देती है। फ़ाइल से जुड़े किसी भी सिस्टम संसाधन को रिलीज़ करता है। एक IOException फेंकता है। |
2 | protected void finalize()throws IOException {}यह विधि फ़ाइल से कनेक्शन को साफ़ करती है। यह सुनिश्चित करता है कि इस फ़ाइल आउटपुट स्ट्रीम की बंद विधि को कॉल किया जाता है जब इस स्ट्रीम के लिए और संदर्भ नहीं होते हैं। एक IOException फेंकता है। |
3 | public int read(int r)throws IOException{}यह विधि InputStream से डेटा के निर्दिष्ट बाइट को पढ़ती है। एक इंट लौटाता है। डेटा की अगली बाइट लौटाता है और -1 लौटाया जाएगा यदि यह फ़ाइल का अंत है। |
4 | public int read(byte[] r) throws IOException{}यह विधि इनपुट स्ट्रीम से एक सरणी में r.length बाइट पढ़ती है। पढ़े गए बाइट्स की कुल संख्या लौटाता है। यदि यह फ़ाइल का अंत है, तो -1 वापस आ जाएगा। |
5 | public int available() throws IOException{}इस फ़ाइल इनपुट स्ट्रीम से पढ़ी जा सकने वाली बाइट्स की संख्या देता है। एक इंट लौटाता है। |
अन्य महत्वपूर्ण इनपुट स्ट्रीम उपलब्ध हैं, अधिक विवरण के लिए आप निम्नलिखित लिंक्स का उल्लेख कर सकते हैं –
- ByteArrayInputStream
- DataInputStream
FileOutputStream
FileOutputStream का उपयोग फ़ाइल बनाने और उसमें डेटा लिखने के लिए किया जाता है। स्ट्रीम आउटपुट के लिए खोलने से पहले, अगर यह पहले से मौजूद नहीं है, तो एक फ़ाइल बनायेगी।
यहाँ दो कंस्ट्रक्टर हैं जिनका उपयोग FileOutputStream ऑब्जेक्ट बनाने के लिए किया जा सकता है।
फ़ाइल लिखने के लिए एक इनपुट स्ट्रीम ऑब्जेक्ट बनाने के लिए निम्नलिखित कंस्ट्रक्टर एक फ़ाइल नाम को एक स्ट्रिंग के रूप में लेता है –
OutputStream f = new FileOutputStream(“C:/java/hello”)
फ़ाइल लिखने के लिए आउटपुट स्ट्रीम ऑब्जेक्ट बनाने के लिए निम्न कन्स्ट्रक्टर फ़ाइल ऑब्जेक्ट लेता है। सबसे पहले, हम फ़ाइल () विधि का उपयोग करके एक फ़ाइल ऑब्जेक्ट बनाते हैं –
File f = new File(“C:/java/hello”);
OutputStream f = new FileOutputStream(f);
एक बार जब आपके पास OutputStream ऑब्जेक्ट हाथ में होता है, तो सहायक Methods की एक सूची होती है, जिसका उपयोग स्ट्रीम पर लिखने या स्ट्रीम पर अन्य ऑपरेशन करने के लिए किया जा सकता है।
Sr.No. | Method & Description |
1 | public void close() throws IOException{}यह विधि फ़ाइल आउटपुट स्ट्रीम को बंद कर देती है। फ़ाइल से जुड़े किसी भी सिस्टम संसाधन को रिलीज़ करता है। एक IOException फेंकता है। |
2 | protected void finalize()throws IOException {}यह विधि फ़ाइल से कनेक्शन को साफ़ करती है। यह सुनिश्चित करता है कि इस फ़ाइल आउटपुट स्ट्रीम की बंद विधि को कॉल किया जाता है जब इस स्ट्रीम के लिए और संदर्भ नहीं होते हैं। एक IOException फेंकता है। |
3 | public void write(int w)throws IOException{}यह विधि निर्दिष्ट बाइट को आउटपुट स्ट्रीम में लिखती है। |
4 | public void write(byte[] w)उल्लिखित बाइट सरणी से आउटपुटस्ट्रीम में w.length बाइट्स लिखता है। |
अन्य महत्वपूर्ण आउटपुट स्ट्रीम उपलब्ध हैं, अधिक विवरण के लिए आप निम्न लिंक्स का उल्लेख कर सकते हैं –
- ByteArrayOutputStream
- DataOutputStream
उदाहरण
निम्नलिखित उदाहरण InputStream और OutputStream – को प्रदर्शित करता है
import java.io.*;
public class fileStreamTest {
public static void main(String args[]) {
try {
byte bWrite [] = {11,21,3,40,5};
OutputStream os = new FileOutputStream(“test.txt”);
for(int x = 0; x < bWrite.length ; x++) {
os.write( bWrite[x] ); // writes the bytes
}
os.close();
InputStream is = new FileInputStream(“test.txt”);
int size = is.available();
for(int i = 0; i < size; i++) {
System.out.print((char)is.read() + ” “);
}
is.close();
} catch (IOException e) {
System.out.print(“Exception”);
}
}
}
उपरोक्त कोड फ़ाइल test.txt बनाएगा और दिए गए नंबरों को बाइनरी प्रारूप में लिखेगा। स्टडआउट स्क्रीन पर वही आउटपुट होगा।
फ़ाइल नेविगेशन और I/O
फ़ाइल नेविगेशन और I/O की मूल बातें जानने के लिए हम कई अन्य कक्षाओं से गुजरेंगे।
- फाइल क्लास
- फाइलरीडर क्लास
- फाइलराइटर क्लास
जावा में directoryएँ (Directories in Java)
एक directory एक फ़ाइल है जिसमें अन्य फ़ाइलों और directoryओं की सूची हो सकती है। directory में उपलब्ध फ़ाइलों को सूचीबद्ध करने के लिए आप directory बनाने के लिए फ़ाइल ऑब्जेक्ट का उपयोग करते हैं। पूर्ण विवरण के लिए, उन सभी Methods की सूची देखें जिन्हें आप फ़ाइल ऑब्जेक्ट पर कॉल कर सकते हैं और directoryओं से संबंधित क्या हैं।
directoryएँ (Creating Directories in Hindi)
दो उपयोगी फ़ाइल उपयोगिता विधियाँ हैं, जिनका उपयोग directoryएँ बनाने के लिए किया जा सकता है –
Mkdir () विधि एक directory बनाती है, सफलता पर सही और विफलता पर गलत होती है। विफलता इंगित करती है कि फ़ाइल ऑब्जेक्ट में निर्दिष्ट पथ पहले से मौजूद है, या यह कि directory नहीं बनाई जा सकती क्योंकि संपूर्ण पथ अभी तक मौजूद नहीं है।
mkdirs() विधि directory और directory के सभी माता-पिता दोनों बनाता है।
निम्नलिखित उदाहरण “/tmp/उपयोगकर्ता/जावा/बिन” directory बनाता है –
Example
import java.io.File;
public class CreateDir {
public static void main(String args[]) {
String dirname = “/tmp/user/java/bin”;
File d = new File(dirname);
// Create directory now.
d.mkdirs();
}
}
“/tmp/user/java/bin” बनाने के लिए उपरोक्त कोड को compiled और निष्पादित करें।
नोट − कन्वेंशन के अनुसार जावा स्वचालित रूप से UNIX और Windows पर पथ विभाजक का ख्याल रखता है। यदि आप Java के Windows संस्करण पर फ़ॉरवर्ड स्लैश (/) का उपयोग करते हैं, तो पथ अभी भी सही तरीके से हल होगा।
लिस्टिंग directoryएँ (Listing Directories)
आप फ़ाइल ऑब्जेक्ट द्वारा प्रदान की गई सूची () विधि का उपयोग directory में उपलब्ध सभी फाइलों और directoryओं को निम्नानुसार सूचीबद्ध करने के लिए कर सकते हैं –
Example
import java.io.File;
public class ReadDir {
public static void main(String[] args) {
File file = null;
String[] paths;
try {
// create new file object
file = new File(“/tmp”);
// array of files and directory
paths = file.list();
// for each name in the path array
for(String path:paths) {
// prints filename and directory name
System.out.println(path);
}
} catch (Exception e) {
// if any error occurs
e.printStackTrace();
}
}
}
यह आपकी /tmp directory में उपलब्ध directoryओं और फाइलों के आधार पर निम्नलिखित परिणाम देगा –
Output
test1.txt
test2.txt
ReadDir.java
ReadDir.class
हम उम्मीद करते है कि आपको “जावा फाइल एंड इनपुट ऑउटपुट (Java Files and Input Output)” से सम्बंधित जानकारी हिंदी में समझ में आयी होंगी यदि आपको बताई गई जानकारी अच्छी लगी हो तो अपने दोस्तों में ऐसे शेयर करे जिससे उनकी भी हेल्प हो सके धन्यवाद!