CodeGym /جاوا بلاگ /Random-UR /جاوا فائلز، پاتھ
John Squirrels
سطح
San Francisco

جاوا فائلز، پاتھ

گروپ میں شائع ہوا۔
ہائے! آج ہم فائلوں اور ڈائریکٹریوں کے ساتھ کام کرنے کے بارے میں بات کریں گے۔ آپ پہلے ہی جانتے ہیں کہ فائل کے مواد کو کیسے منظم کرنا ہے: ہم نے اس کے لیے بہت سارے اسباق وقف کیے ہیں :) میرے خیال میں آپ کو ان مقاصد کے لیے استعمال ہونے والی چند کلاسوں کو یاد رکھنا آسان لگتا ہے۔ آج کے سبق میں، ہم خاص طور پر فائل مینجمنٹ کے بارے میں بات کریں گے: تخلیق کرنا، نام تبدیل کرنا، وغیرہ۔ جاوا 7 سے پہلے، اس طرح کے تمام آپریشنز فائل کلاس کے ذریعے کیے جاتے تھے۔ آپ اس کے بارے میں یہاں پڑھ سکتے ہیں ۔ لیکن جاوا 7 میں، زبان کے تخلیق کاروں نے فیصلہ کیا کہ ہم فائلوں اور ڈائریکٹریوں کے ساتھ کیسے کام کرتے ہیں۔ ایسا اس لیے ہوا کیونکہ فائل کلاس میں کئی خرابیاں تھیں۔ مثال کے طور پر، اس میں کاپی() طریقہ نہیں تھا ، جو آپ کو فائل کو ایک جگہ سے دوسری جگہ کاپی کرنے دیتا ہے (ایک بظاہر ضروری صلاحیت)۔ اس کے علاوہ، فائل کلاس میں بہت سے طریقے تھے جو بولین ویلیو واپس کرتے تھے۔ جب کوئی غلطی ہوتی ہے، تو اس طرح کا طریقہ غلط واپس آتا ہے۔ یہ ایک استثناء نہیں پھینکتا ہے، غلطیوں کی شناخت اور ان کی وجوہات کی تشخیص کرنا بہت مشکل بناتا ہے. سنگل فائل کلاس کی جگہ ، 3 کلاسیں نمودار ہوئیں: Paths ، Path ، اور Files ۔ ٹھیک ہے، درست ہونے کے لیے، پاتھ ایک انٹرفیس ہے، کلاس نہیں۔ آئیے معلوم کریں کہ وہ ایک دوسرے سے کیسے مختلف ہیں اور ہمیں ان میں سے ہر ایک کی ضرورت کیوں ہے۔ آئیے سب سے آسان کے ساتھ شروع کریں: راستے ۔

راستے

پاتھز ایک بہت ہی آسان کلاس ہے جس میں ایک ہی جامد طریقہ ہے: get() ۔ یہ مکمل طور پر پاس کردہ سٹرنگ یا URI سے پاتھ آبجیکٹ حاصل کرنے کے لیے بنایا گیا تھا۔ اس میں کوئی دوسری فعالیت نہیں ہے۔ یہاں کام پر اس کی ایک مثال ہے:

import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {

   public static void main(String[] args) {

       Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
   }
}
سب سے پیچیدہ کلاس نہیں ہے، ٹھیک ہے؟ :) ٹھیک ہے، ہمیں یہ پاتھ قسم بھی مل گئی ہے۔ آئیے معلوم کریں کہ راستہ کیا ہے اور اس کی ضرورت کیوں ہے :)

راستہ

Path , by and large , File کلاس کا دوبارہ ڈیزائن کردہ ینالاگ ہے ۔ اس کے ساتھ کام کرنا File سے کہیں زیادہ آسان ہے ۔ سب سے پہلے ، بہت سے یوٹیلیٹی (static) طریقے نکالے گئے اور Files کلاس میں منتقل کر دیے گئے۔ دوسرا ، پاتھ انٹرفیس کے طریقوں کی واپسی کی اقدار پر آرڈر نافذ کیا گیا تھا ۔ فائل کلاس میں ، طریقوں نے یا تو ایک String ، یا ایک boolean ، یا ایک File واپس کیا ۔ اس کا پتہ لگانا آسان نہیں تھا۔ مثال کے طور پر، ایک getParent() طریقہ تھا جس نے موجودہ فائل کے پیرنٹ پاتھ کی نمائندگی کرنے والی سٹرنگ واپس کی۔ لیکن ایک getParentFile() طریقہ بھی تھا ، جس نے وہی چیز واپس کی لیکن فائل آبجیکٹ کی شکل میں! یہ واضح طور پر بے کار ہے۔ اس کے مطابق، پاتھ انٹرفیس میں ، getParent() طریقہ اور فائلوں کے ساتھ کام کرنے کے دوسرے طریقے صرف پاتھ آبجیکٹ کو واپس کرتے ہیں۔ اختیارات کا کوئی ڈھیر نہیں - سب کچھ آسان اور آسان ہے۔ پاتھ کے پاس کچھ مفید طریقے کیا ہیں ؟ یہاں ان میں سے کچھ اور مثالیں ہیں کہ وہ کیسے کام کرتے ہیں:
  • getFileName() : راستے سے فائل کا نام واپس کرتا ہے۔

  • getParent() : موجودہ راستے کی "والدین" ڈائرکٹری کو لوٹاتا ہے (دوسرے لفظوں میں، ڈائریکٹری کے درخت میں فوراً اوپر واقع ڈائریکٹری)؛

  • getRoot() : "روٹ" ڈائرکٹری واپس کرتا ہے، یعنی ڈائرکٹری ٹری کے اوپری حصے میں موجود ڈائرکٹری؛

  • startsWith() , endsWith() : چیک کریں کہ آیا راستہ گزرے ہوئے راستے سے شروع ہوتا ہے یا ختم ہوتا ہے:

    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
    
           Path fileName = testFilePath.getFileName();
           System.out.println(fileName);
    
           Path parent = testFilePath.getParent();
           System.out.println(parent);
    
           Path root = testFilePath.getRoot();
           System.out.println(root);
    
           boolean endWithTxt = testFilePath.endsWith("Desktop\\testFile.txt");
           System.out.println(endWithTxt);
    
           boolean startsWithLalala = testFilePath.startsWith("lalalala");
           System.out.println(startsWithLalala);
       }
    }

    کنسول آؤٹ پٹ:

    
    testFile.txt
    C:\Users\Username\Desktop
    C:\
    true
    false

    اس پر توجہ دیں کہ endsWith() طریقہ کیسے کام کرتا ہے۔ یہ چیک کرتا ہے کہ آیا موجودہ راستہ گزرے ہوئے راستے کے ساتھ ختم ہوتا ہے ۔ خاص طور پر، چاہے وہ راستے میں ہو ، پاس شدہ سٹرنگ میں نہیں ۔

    ان دو کالوں کے نتائج کا موازنہ کریں:

    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
    
           System.out.println(testFilePath.endsWith("estFile.txt"));
           System.out.println(testFilePath.endsWith("Desktop\\testFile.txt"));
       }
    }

    کنسول آؤٹ پٹ:

    
    false
    true

    endsWith () طریقہ کو ایک حقیقی راستہ سے گزرنا چاہیے، نہ کہ صرف حروف کا ایک مجموعہ: بصورت دیگر، نتیجہ ہمیشہ غلط ہو گا، یہاں تک کہ اگر موجودہ راستہ واقعی حروف کی اس ترتیب کے ساتھ ختم ہو جائے (جیسا کہ "estFile.txt" کا معاملہ ہے۔ "اوپر کی مثال میں)۔

    اس کے علاوہ، پاتھ میں طریقوں کا ایک گروپ ہے جو مطلق (مکمل) اور متعلقہ راستوں کے ساتھ کام کرنا آسان بناتا ہے ۔

آئیے ان طریقوں کو دیکھتے ہیں:
  • اگر موجودہ راستہ مطلق ہے تو boolean isAbsolute() صحیح لوٹتا ہے:

    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
    
           System.out.println(testFilePath.isAbsolute());
       }
    }

    کنسول آؤٹ پٹ:

    
    true
  • Path normalize() : موجودہ راستے کو "معمول" بناتا ہے، اس سے غیر ضروری عناصر کو ہٹاتا ہے۔ آپ جانتے ہوں گے کہ مشہور آپریٹنگ سسٹم میں علامتیں ""۔ (موجودہ ڈائریکٹری) اور ".." (والدین ڈائریکٹری) اکثر راستوں کو نامزد کرنے کے لیے استعمال ہوتے ہیں۔ مثال کے طور پر، " ./Pictures/dog.jpg " کا مطلب ہے کہ موجودہ ڈائرکٹری میں "Pictures" فولڈر ہے، جس کے نتیجے میں "dog.jpg" فائل ہوتی ہے۔

    یہاں دیکھو. اگر کوئی راستہ استعمال کر رہا ہے "." یا ".." آپ کے پروگرام میں ظاہر ہوتا ہے، نارملائز() طریقہ انہیں ہٹا دے گا اور ایک ایسا راستہ تیار کرے گا جس میں ان پر مشتمل نہ ہو:

    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
          
           Path path5 = Paths.get("C:\\Users\\Java\\.\\examples");
          
           System.out.println(path5.normalize());
          
           Path path6 = Paths.get("C:\\Users\\Java\\..\\examples");
           System.out.println(path6.normalize());
       }
    }

    کنسول آؤٹ پٹ:

    
    C:\Users\Java\examples
    C:\Users\examples
  • Path relativize() : موجودہ اور گزرے ہوئے راستے کے درمیان رشتہ دار راستے کی گنتی کرتا ہے۔

    مثال کے طور پر:

    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath1 = Paths.get("C:\\Users\\Users\\Users\\Users");
           Path testFilePath2 = Paths.get("C:\\Users\\Users\\Users\\Users\\Username\\Desktop\\testFile.txt");
    
           System.out.println(testFilePath1.relativize(testFilePath2));
       }
    }

    کنسول آؤٹ پٹ:

    
    Username\Desktop\testFile.txt

راستے کے طریقوں کی مکمل فہرست کافی لمبی ہے۔ آپ ان سب کو اوریکل دستاویزات میں تلاش کر سکتے ہیں ۔ اب ہم فائلز پر غور کرنے کے لیے آگے بڑھیں گے ۔

فائلوں

فائلز ایک یوٹیلیٹی کلاس ہے جو فائل کلاسسے نکالے گئے جامد طریقے رکھتی ہےفائلوں کا موازنہ Arrays یا Collections سے کیا جا سکتا ہے۔ فرق یہ ہے کہ یہ فائلوں کے ساتھ کام کرتا ہے، صفوں یا مجموعوں کے ساتھ نہیں :) یہ فائلوں اور ڈائریکٹریوں کے انتظام پر توجہ مرکوز کرتا ہے۔ فائل کلاس کے جامد طریقوں کا استعمال کرتے ہوئے، ہم فائلوں اور ڈائریکٹریوں کو تخلیق، حذف اور منتقل کر سکتے ہیں۔ یہ کارروائیاں createFile() (ڈائریکٹریوں کے لیے، createDirectory() move() ، اور delete() طریقوں سے کی جاتی ہیں۔ انہیں استعمال کرنے کا طریقہ یہاں ہے:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

public class Main {

   public static void main(String[] args) throws IOException {

       // Create a file
       Path testFile1 = Files.createFile(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt"));
       System.out.println("Was the file created successfully?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       // Create a directory
       Path testDirectory = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory"));
       System.out.println("Was the directory created successfully?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory")));

       // Move the file from the desktop to the testDirectory directory. When you move a folder, you need to indicate its name in the folder!
       testFile1 = Files.move(testFile1, Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt"), REPLACE_EXISTING);

       System.out.println("Did our file remain on the desktop?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       System.out.println("Has our file been moved to testDirectory?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt")));

       // Delete a file
       Files.delete(testFile1);
       System.out.println("Does the file still exist?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt")));
   }
}
یہاں ہم سب سے پہلے ڈیسک ٹاپ پر ایک فائل ( Files.createFile() طریقہ) بناتے ہیں۔ پھر ہم اسی جگہ پر ایک فولڈر بناتے ہیں ( Files.createDirectory() طریقہ۔ اس کے بعد، ہم فائل ( Files.move() طریقہ) کو ڈیسک ٹاپ سے اس نئے فولڈر میں منتقل کرتے ہیں، اور آخر میں ہم فائل ( Files.delete() طریقہ) کو حذف کر دیتے ہیں۔ کنسول آؤٹ پٹ:

Was the file created successfully? 
true 
Was the directory created successfully? 
true
Did our file remain on the desktop? 
false 
Has our file been moved to testDirectory? 
true 
Does the file still exist? 
false
نوٹ:انٹرفیس کے طریقوں کی طرح Path، کلاس کے بہت سے طریقےFilesPath کسی چیز کو واپس کرتے ہیں ۔ کلاس کے زیادہ تر طریقے اشیاء کو بطور ان پٹ Filesبھی لیتے ہیں ۔ Pathیہاں Paths.get()طریقہ آپ کا وفادار مددگار ہوگا - اس کا اچھا استعمال کریں۔ اس میں اور کیا دلچسپ ہے Files؟ پرانے Fileطبقے میں واقعی جس چیز کی کمی تھی وہ ایک copy()طریقہ ہے! ہم نے اس سبق کے آغاز میں اس کے بارے میں بات کی تھی۔ اب اس سے ملنے کا وقت ہے!

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

public class Main {

   public static void main(String[] args) throws IOException {

       // Create a file
       Path testFile1 = Files.createFile(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt"));
       System.out.println("Was the file created successfully?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       // Create a directory
       Path testDirectory2 = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2"));
       System.out.println("Was the directory created successfully?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2")));

       // Copy the file from the desktop to the testDirectory2 directory.
       testFile1 = Files.copy(testFile1, Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2\\testFile111.txt"), REPLACE_EXISTING);

       System.out.println("Did our file remain on the desktop?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       System.out.println("Was our file copied to testDirectory?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2\\testFile111.txt")));
   }
}
کنسول آؤٹ پٹ:

Was the file created successfully? 
true 
Was the directory created successfully? 
true 
Did our file remain on the desktop? 
true 
Was our file copied to testDirectory? 
true
اب آپ جانتے ہیں کہ فائلوں کو پروگرام کے مطابق کیسے کاپی کرنا ہے! :) بلاشبہ، Filesکلاس آپ کو نہ صرف ایک فائل کا خود انتظام کرنے دیتی ہے، بلکہ اس کے مواد کے ساتھ بھی کام کرتی ہے۔ اس میں write()فائل میں ڈیٹا لکھنے کا طریقہ ہے، اور ڈیٹا پڑھنے کے لیے تمام 3 طریقے ہیں: read()readAllBytes()اور readAllLines() ہم آخری پر تفصیل سے غور کریں گے۔ وہ کیوں؟ کیونکہ اس میں واپسی کی ایک بہت ہی دلچسپ قسم ہے: List<String>! یعنی، یہ ہمیں فائل میں موجود تمام لائنوں کی فہرست واپس کرتا ہے۔ forیقینا، یہ فائل کے مواد کے ساتھ کام کرنا بہت آسان بناتا ہے، کیونکہ پوری فائل، لائن بہ لائن، مثال کے طور پر، ایک عام لوپ کا استعمال کرتے ہوئے کنسول پر ظاہر کی جا سکتی ہے:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

import static java.nio.charset.StandardCharsets.UTF_8;

public class Main {

   public static void main(String[] args) throws IOException {

       List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"), UTF_8);

       for (String s: lines) {
           System.out.println(s);
       }
   }
}
کنسول آؤٹ پٹ:

I still recall the wondrous moment: 
When you appeared before my sight, 
As though a brief and fleeting omen, 
Pure phantom in enchanting light.
سپر آسان! :) یہ صلاحیت جاوا 7 میں نمودار ہوئی۔ سٹریم API جاوا 8 میں نمودار ہوا۔ یہ جاوا میں فنکشنل پروگرامنگ کے کچھ عناصر کا اضافہ کرتا ہے۔ امیر فائل ہینڈلنگ کی صلاحیتوں سمیت. تصور کریں کہ ہمارے پاس درج ذیل کام ہے: وہ تمام لائنیں تلاش کریں جو لفظ "As" سے شروع ہوتی ہیں، انہیں UPPERCASE میں تبدیل کریں، اور کنسول پر ڈسپلے کریں۔ Filesجاوا 7 میں کلاس کا استعمال کرتے ہوئے حل کیسا نظر آئے گا ؟ کچھ اس طرح:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import static java.nio.charset.StandardCharsets.UTF_8;

public class Main {

   public static void main(String[] args) throws IOException {

       List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"), UTF_8);

       List<String> result = new ArrayList<>();

       for (String s: lines) {
           if (s.startsWith("As")) {
               String upper = s.toUpperCase();
               result.add(upper);
           }
       }

       for (String s: result) {
           System.out.println(s);
       }
   }
}
کنسول آؤٹ پٹ:

AS THOUGH A BRIEF AND FLEETING OMEN, 
PURE PHANTOM IN ENCHANTING LIGHT.
مشن پورا ہو گیا، لیکن کیا آپ کو نہیں لگتا کہ اتنے آسان کام کے لیے ہمارا کوڈ تھوڑا سا... لفظی نکلا؟ جاوا 8 کے اسٹریم API کا استعمال کرتے ہوئے، حل بہت زیادہ خوبصورت لگتا ہے:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

   public static void main(String[] args) throws IOException {

       Stream<String> stream = Files.lines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"));

       List<String> result  = stream
               .filter(line -> line.startsWith("As"))
               .map(String::toUpperCase)
               .collect(Collectors.toList());
       result.forEach(System.out::println);
   }
}
ہم نے وہی نتیجہ حاصل کیا، لیکن بہت کم کوڈ کے ساتھ! مزید یہ کہ کوئی یہ نہیں کہہ سکتا کہ ہم "پڑھنے کی اہلیت" کھو چکے ہیں۔ میرے خیال میں آپ آسانی سے اس پر تبصرہ کر سکتے ہیں کہ یہ کوڈ کیا کرتا ہے، یہاں تک کہ Stream API سے واقف نہ ہوں۔ مختصراً، ایک سلسلہ عناصر کا ایک سلسلہ ہے، جس پر آپ مختلف کام انجام دے سکتے ہیں۔ ہمیں Files.lines()طریقہ سے ایک سٹریم آبجیکٹ ملتا ہے، اور پھر اس پر 3 فنکشن لاگو ہوتے ہیں:
  1. ہم filter()فائل سے صرف ان لائنوں کو منتخب کرنے کے لیے طریقہ استعمال کرتے ہیں جو "As" سے شروع ہوتی ہیں۔

  2. ہم طریقہ استعمال کرتے ہوئے تمام منتخب لائنوں سے گزرتے ہیں map()اور ان میں سے ہر ایک کو UPPERCASE میں تبدیل کرتے ہیں۔

  3. ہم collect()تمام موصول لائنوں کو ایک میں جمع کرنے کے لیے طریقہ استعمال کرتے ہیں List۔

ہمیں ایک ہی آؤٹ پٹ ملتا ہے:

AS THOUGH A BRIEF AND FLEETING OMEN, 
PURE PHANTOM IN ENCHANTING LIGHT.
اب آئیے اپنی روٹی اور مکھن کی طرف لوٹتے ہیں، یعنی فائلز :) آخری صلاحیت جس پر ہم آج غور کریں گے وہ فائل ٹری کے ذریعے چلنا ہے ۔ جدید آپریٹنگ سسٹمز میں، فائل کا ڈھانچہ اکثر درخت کی طرح نظر آتا ہے: اس کی جڑ ہوتی ہے اور شاخیں ہوتی ہیں، جن کی دوسری شاخیں بھی ہوسکتی ہیں، وغیرہ۔ جڑ اور شاخیں ڈائریکٹریز ہیں۔ مثال کے طور پر، ڈائریکٹری " С:// " جڑ ہو سکتی ہے۔ اس میں دو شاخیں شامل ہیں: " C://Downloads " اور " C://Users "۔ ان شاخوں میں سے ہر ایک کی دو شاخیں ہیں: " C://Downloads/Pictures "، " C://Downloads/Video "، " C://Users/JohnSmith "، " C://Users/Pudge2005 "۔ اور ان شاخوں کے بدلے میں دوسری شاخیں وغیرہ ہوتی ہیں اور اسی لیے ہم اسے درخت کہتے ہیں۔ لینکس پر، ساخت ایک جیسی ہے، لیکن / ڈائریکٹری فائلز، پاتھ - 2جڑ ہے. اب تصور کریں کہ ہمیں روٹ ڈائرکٹری سے شروع کرنے کی ضرورت ہے، اس کے تمام فولڈرز اور ذیلی فولڈرز میں سے گزرنا ہے، اور ایسی فائلیں تلاش کرنی ہیں جن میں کچھ خاص مواد ہے۔ ہم ان فائلوں کو تلاش کریں گے جن میں یہ لائن ہوگی "یہ وہ فائل ہے جس کی ہمیں ضرورت ہے!" ہم "testFolder" فولڈر لیں گے، جو ڈیسک ٹاپ پر ہے، روٹ ڈائریکٹری کے طور پر۔ اس کے مندرجات یہ ہیں: فائلز، پاتھ - 3level1-a اور level1-b فولڈرز بھی فولڈرز پر مشتمل ہیں: فائلز، پاتھ - 4فائلز، پاتھ - 5ان "دوسرے درجے کے فولڈرز" میں کوئی فولڈر نہیں ہیں، صرف انفرادی فائلیں: فائلز، پاتھ - 6فائلز، پاتھ - 7جن مواد کی ہمیں ضرورت ہے ان کے ساتھ 3 فائلوں کو جان بوجھ کر وضاحتی نام دیے گئے ہیں: FileWeNeed1۔ txt، FileWeNeed2.txt، FileWeNeed3.txt۔ یہ بالکل وہی فائلیں ہیں جن کی ہمیں جاوا کا استعمال کرتے ہوئے تلاش کرنے کی ضرورت ہے۔ ہم یہ کیسے کرتے ہیں؟ فائل ٹری کو عبور کرنے کا ایک بہت ہی طاقتور طریقہ ہماری مدد کے لیے آتا ہے Files.walkFileTree (): یہاں ہمیں کیا کرنے کی ضرورت ہے۔ سب سے پہلے، ہمیں ایک کی ضرورت ہے FileVisitor. FileVisitorایک خاص انٹرفیس ہے، جس میں فائل ٹری کو عبور کرنے کے طریقے بیان کیے گئے ہیں۔ خاص طور پر، یہ وہ جگہ ہے جہاں ہم فائل کے مواد کو پڑھنے اور یہ جانچنے کے لیے منطق ڈالیں گے کہ آیا اس میں وہ متن موجود ہے جس کی ہمیں ضرورت ہے۔ یہاں یہ ہے کہ ہماری FileVisitorنظر کیسی ہے:

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;

public class MyFileVisitor extends SimpleFileVisitor<Path> {

   @Override
   public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {

       List<String> lines = Files.readAllLines(file);
       for (String s: lines) {
           if (s.contains("This is the file we need")) {
               System.out.println("We found a file we need!");
               System.out.println(file.toAbsolutePath());
               break;
           }
       }

       return FileVisitResult.CONTINUE;
   }
}
اس صورت میں، ہماری کلاس وراثت میں ملتی ہے SimpleFileVisitor۔ یہ ایک ایسی کلاس ہے جو لاگو کرتی ہے FileVisitor، جس میں ہمیں صرف ایک طریقہ کو اوور رائڈ کرنے کی ضرورت ہے: visitFile()۔ یہاں ہم وضاحت کرتے ہیں کہ ہر ڈائریکٹری میں ہر فائل کے ساتھ کیا کرنے کی ضرورت ہے۔ اگر آپ کو فائل کے ڈھانچے کو عبور کرنے کے لیے زیادہ پیچیدہ منطق کی ضرورت ہے، تو آپ کو خود اپنا نفاذ لکھنا چاہیے FileVisitor۔ آپ کو اس کلاس میں مزید 3 طریقوں کو لاگو کرنے کی ضرورت ہوگی:
  • preVisitDirectory(): فولڈر میں داخل ہونے سے پہلے عمل کرنے کی منطق؛

  • visitFileFailed()اگر کسی فائل کو وزٹ نہیں کیا جا سکتا ہے تو عمل کرنے کی منطق (رسائی نہیں، یا دیگر وجوہات کی بناء پر)؛

  • postVisitDirectory(): فولڈر میں داخل ہونے کے بعد عمل کرنے کی منطق۔

ہمیں ایسی کسی منطق کی ضرورت نہیں ہے، لہذا ہم اس کے ساتھ ٹھیک ہیں SimpleFileVisitor۔ طریقہ کار کے اندر منطق visitFile()بہت آسان ہے: فائل میں موجود تمام لائنوں کو پڑھیں، چیک کریں کہ آیا ان میں وہ مواد ہے جس کی ہمیں ضرورت ہے، اور اگر ایسا ہے تو کنسول پر مطلق راستہ پرنٹ کریں۔ صرف ایک لائن جو آپ کو دشواری کا باعث بن سکتی ہے وہ ہے:

return FileVisitResult.CONTINUE;
اصل میں، یہ بہت آسان ہے. یہاں ہم صرف یہ بیان کر رہے ہیں کہ فائل کو وزٹ کرنے اور تمام ضروری کارروائیوں کو انجام دینے کے بعد پروگرام کو کیا کرنا چاہیے۔ ہمارے معاملے میں، ہم درخت کو عبور کرنا جاری رکھنا چاہتے ہیں، لہذا ہم CONTINUEآپشن کا انتخاب کرتے ہیں۔ لیکن، متبادل طور پر، ہمارا ایک مختلف مقصد ہو سکتا ہے: "یہ وہ فائل ہے جس کی ہمیں ضرورت ہے" پر مشتمل تمام فائلوں کو تلاش کرنے کے بجائے صرف ایک ایسی فائل تلاش کریں ۔ اس کے بعد، پروگرام کو ختم کرنا چاہئے. اس صورت میں، ہمارا کوڈ بالکل ایک جیسا نظر آئے گا، لیکن وقفے کے بجائے یہ ہوگا:

return FileVisitResult.TERMINATE;
ٹھیک ہے، آئیے اپنا کوڈ چلائیں اور دیکھیں کہ آیا یہ کام کرتا ہے۔

import java.io.IOException;
import java.nio.file.*;

public class Main {

   public static void main(String[] args) throws IOException {

       Files.walkFileTree(Paths.get("C:\\Users\\Username\\Desktop\\testFolder"), new MyFileVisitor());
   }
}
کنسول آؤٹ پٹ:

We found a file we need! 
C:\Users\Username\Desktop\testFolder\FileWeNeed1.txt 
We found a file we need! 
C:\Users\Username\Desktop\testFolder\level1-a\level2-a-a\FileWeNeed2.txt 
We found a file we need! 
C:\Users\Username\Desktop\testFolder\level1-b\level2-b-b\FileWeNeed3.txt
بہترین! یہ کام کر گیا! :) آپ اس چھوٹے چیلنج کو بھی قبول کر سکتے ہیں: SimpleFileVisitorایک عام سے تبدیل کریں FileVisitor، تمام 4 طریقوں کو اوور رائیڈ کریں، اور پروگرام کے لیے اپنا مقصد بنائیں۔ مثال کے طور پر، آپ ایک ایسا پروگرام لکھ سکتے ہیں جو اس کے تمام اعمال کو لاگ کرتا ہے: فائل یا فولڈر کا نام ان میں داخل کرنے سے پہلے یا بعد میں ظاہر کریں۔ ابھی کے لیے اتنا ہی ہے۔ پھر ملیں گے! :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION