जावा - फाइलें और आई / ओ

Java.io पैकेज में लगभग हर वर्ग शामिल है जिसे आपको कभी भी जावा में इनपुट और आउटपुट (I / O) करने की आवश्यकता हो सकती है। ये सभी धाराएँ एक इनपुट स्रोत और एक आउटपुट गंतव्य का प्रतिनिधित्व करती हैं। Java.io पैकेज में स्ट्रीम कई डेटा का समर्थन करता है जैसे कि आदिम, वस्तु, स्थानीयकृत वर्ण, आदि।

धारा

एक धारा को डेटा के अनुक्रम के रूप में परिभाषित किया जा सकता है। दो प्रकार की धाराएँ हैं -

  • InPutStream - किसी स्रोत से डेटा पढ़ने के लिए InputStream का उपयोग किया जाता है।

  • OutPutStream - OutputStream का उपयोग किसी डेस्टिनेशन पर डेटा लिखने के लिए किया जाता है।

जावा फाइलों और नेटवर्क से संबंधित I / O के लिए मजबूत लेकिन लचीला समर्थन प्रदान करता है लेकिन यह ट्यूटोरियल स्ट्रीम और I / O से संबंधित बहुत ही बुनियादी कार्यक्षमता को कवर करता है। हम एक-एक करके सबसे अधिक इस्तेमाल किए जाने वाले उदाहरण देखेंगे -

बाइट स्ट्रीम

जावा बाइट स्ट्रीम का उपयोग 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.

अगले चरण के रूप में, उपरोक्त प्रोग्राम को संकलित करें और इसे निष्पादित करें, जिसके परिणामस्वरूप output.txt फ़ाइल उसी सामग्री के साथ बनाई जाएगी जैसा कि हमारे पास इनपुट में है। तो चलिए CopyFile.java फाइल में उपरोक्त कोड डालते हैं और निम्न कार्य करते हैं -

$javac CopyFile.java
$java CopyFile

चरित्र धाराओं

जावा Byte धाराओं का उपयोग 8-बिट बाइट्स के इनपुट और आउटपुट को निष्पादित करने के लिए किया जाता है, जबकि जावा Characterधाराएँ 16-बिट यूनिकोड के लिए इनपुट और आउटपुट प्रदर्शन करने के लिए उपयोग की जाती हैं। यद्यपि वर्ण धाराओं से संबंधित कई वर्ग हैं लेकिन सबसे अधिक उपयोग की जाने वाली कक्षाएं हैं,FileReader तथा FileWriter। हालांकि आंतरिक रूप से FileReader FileInputStream का उपयोग करता है और FileWriter FileOutputStream का उपयोग करता है लेकिन यहाँ प्रमुख अंतर यह है कि FileReader एक समय में दो बाइट्स पढ़ता है और FileWriter एक बार में दो बाइट्स लिखता है।

हम उपरोक्त उदाहरण को फिर से लिख सकते हैं, जो इन दो वर्गों का उपयोग इनपुट फ़ाइल (यूनिकोड वर्ण वाले) को आउटपुट फ़ाइल में कॉपी करने के लिए करता है -

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.

अगले चरण के रूप में, उपरोक्त प्रोग्राम को संकलित करें और इसे निष्पादित करें, जिसके परिणामस्वरूप output.txt फ़ाइल उसी सामग्री के साथ बनाई जाएगी जैसा कि हमारे पास इनपुट में है। तो चलिए CopyFile.java फाइल में उपरोक्त कोड डालते हैं और निम्न कार्य करते हैं -

$javac CopyFile.java
$java CopyFile

मानक धाराएँ

सभी प्रोग्रामिंग भाषाएं मानक I / O के लिए समर्थन प्रदान करती हैं जहां उपयोगकर्ता का कार्यक्रम एक कीबोर्ड से इनपुट ले सकता है और फिर कंप्यूटर स्क्रीन पर आउटपुट का उत्पादन कर सकता है। यदि आप C या C ++ प्रोग्रामिंग भाषाओं से अवगत हैं, तो आपको तीन मानक डिवाइस STDIN, STDOUT और STDRR के बारे में पता होना चाहिए। इसी तरह, जावा निम्नलिखित तीन मानक धाराएँ प्रदान करता है -

  • Standard Input - इसका उपयोग उपयोगकर्ता के प्रोग्राम को डेटा खिलाने के लिए किया जाता है और आमतौर पर एक कीबोर्ड का उपयोग मानक इनपुट स्ट्रीम के रूप में किया जाता है और इसका प्रतिनिधित्व किया जाता है System.in

  • Standard Output - इसका उपयोग उपयोगकर्ता के कार्यक्रम द्वारा उत्पादित डेटा को आउटपुट करने के लिए किया जाता है और आमतौर पर एक कंप्यूटर स्क्रीन का उपयोग मानक आउटपुट स्ट्रीम के लिए किया जाता है और इसका प्रतिनिधित्व किया जाता है System.out

  • Standard Error - इसका उपयोग उपयोगकर्ता के प्रोग्राम द्वारा उत्पादित त्रुटि डेटा को आउटपुट करने के लिए किया जाता है और आमतौर पर एक कंप्यूटर स्क्रीन का उपयोग मानक त्रुटि स्ट्रीम के लिए किया जाता है और इसका प्रतिनिधित्व किया जाता है System.err

निम्नलिखित एक सरल कार्यक्रम है, जो बनाता है InputStreamReader जब तक उपयोगकर्ता "q" टाइप करता है तब तक मानक इनपुट स्ट्रीम को पढ़ने के लिए -

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 फ़ाइल में रखें और निम्न प्रोग्राम में दिखाए अनुसार इसे संकलित और निष्पादित करने का प्रयास करें। जब तक हम 'q' दबाते हैं, तब तक यह प्रोग्राम उसी वर्ण को पढ़ता और आउटपुट करता रहता है -

$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q

फाइल पढ़ना और लिखना

जैसा कि पहले वर्णित है, एक धारा को डेटा के अनुक्रम के रूप में परिभाषित किया जा सकता है। InputStream एक स्रोत और से डेटा पढ़ने के लिए प्रयोग किया जाता है OutputStream एक गंतव्य के लिए डेटा लिखने के लिए प्रयोग किया जाता है।

इनपुट और आउटपुट स्ट्रीम से निपटने के लिए यहां कक्षाओं का एक पदानुक्रम है।

दो महत्वपूर्ण धाराएँ हैं FileInputStream तथा FileOutputStream, जो इस ट्यूटोरियल में चर्चा की जाएगी।

FileInputStream

इस स्ट्रीम का उपयोग फाइलों से डेटा पढ़ने के लिए किया जाता है। कीवर्ड का उपयोग करके ऑब्जेक्ट बनाए जा सकते हैंnew और कई प्रकार के निर्माणकर्ता उपलब्ध हैं।

निम्नलिखित कंस्ट्रक्टर फ़ाइल को पढ़ने के लिए एक इनपुट स्ट्रीम ऑब्जेक्ट बनाने के लिए एक स्ट्रिंग के रूप में एक फ़ाइल का नाम लेता है -

InputStream f = new FileInputStream("C:/java/hello");

निम्नलिखित कंस्ट्रक्टर फ़ाइल को पढ़ने के लिए एक इनपुट स्ट्रीम ऑब्जेक्ट बनाने के लिए एक फ़ाइल ऑब्जेक्ट लेता है। पहले हम फ़ाइल () विधि का उपयोग करके एक फ़ाइल ऑब्जेक्ट बनाते हैं -

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

एक बार जब आपके पास इनपुटस्ट्रीम ऑब्जेक्ट हाथ में होता है, तो सहायक विधियों की एक सूची होती है, जिसका उपयोग स्ट्रीम को पढ़ने या स्ट्रीम पर अन्य संचालन करने के लिए किया जा सकता है।

अनु क्रमांक। विधि और विवरण
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 ऑब्जेक्ट होता है, तो सहायक विधियों की एक सूची होती है, जिसका उपयोग स्ट्रीम पर लिखने या स्ट्रीम पर अन्य संचालन करने के लिए किया जा सकता है।

अनु क्रमांक। विधि और विवरण
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

Example

निम्न इनपुटस्ट्रीम और आउटपुटस्ट्रीम को प्रदर्शित करने के लिए उदाहरण है -

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 बनाएगा और बाइनरी प्रारूप में दिए गए नंबर लिखेगा। वही stdout स्क्रीन पर आउटपुट होगा।

फ़ाइल नेविगेशन और I / O

कई अन्य कक्षाएं हैं जो हम फाइल नेविगेशन और I / O की मूल बातें जानने के लिए करेंगे।

  • फ़ाइल वर्ग

  • FileReader वर्ग

  • FileWriter क्लास

जावा में निर्देशिकाएँ

एक निर्देशिका एक फ़ाइल है जिसमें अन्य फ़ाइलों और निर्देशिकाओं की सूची हो सकती है। तुम इस्तेमालFileनिर्देशिका बनाने के लिए ऑब्जेक्ट, एक निर्देशिका में उपलब्ध फ़ाइलों को सूचीबद्ध करने के लिए। पूर्ण विवरण के लिए, उन सभी विधियों की सूची देखें जिन्हें आप फ़ाइल ऑब्जेक्ट पर कॉल कर सकते हैं और जो निर्देशिकाओं से संबंधित हैं।

निर्देशिका बनाना

दो उपयोगी हैं File उपयोगिता विधियाँ, जिनका उपयोग निर्देशिका बनाने के लिए किया जा सकता है -

  • mkdir( )विधि एक निर्देशिका बनाती है, सफलता पर सही और असफलता पर झूठ। विफलता इंगित करती है कि फ़ाइल ऑब्जेक्ट में निर्दिष्ट पथ पहले से मौजूद है, या कि निर्देशिका नहीं बनाई जा सकती क्योंकि संपूर्ण पथ अभी तक मौजूद नहीं है।

  • mkdirs() विधि एक निर्देशिका और निर्देशिका के सभी माता-पिता दोनों बनाती है।

निम्नलिखित उदाहरण "/ tmp / user / java / bin" निर्देशिका बनाता है -

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" बनाने के लिए उपरोक्त कोड को संकलित और निष्पादित करें।

Note- जावा स्वचालित रूप से सम्मेलनों के अनुसार UNIX और विंडोज पर पथ विभाजकों का ख्याल रखता है। यदि आप जावा के विंडोज संस्करण पर फ़ॉरवर्ड स्लैश (/) का उपयोग करते हैं, तो पथ अभी भी सही तरीके से हल होगा।

लिस्टिंग निर्देशिका

आप उपयोग कर सकते हैं list( ) द्वारा प्रदान की गई विधि File एक निर्देशिका में उपलब्ध सभी फाइलों और निर्देशिकाओं को सूचीबद्ध करने के लिए वस्तु निम्नानुसार है -

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 निर्देशिका -

Output

test1.txt
test2.txt
ReadDir.java
ReadDir.class