JavaRush /جاوا بلاگ /Random-UR /جاوا فائلز، پاتھ

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

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

راستے

Pathsایک واحد جامد طریقہ کے ساتھ ایک بہت ہی آسان کلاس ہے get()۔ اسے مکمل طور پر پاس شدہ سٹرنگ یا URI سے قسم کی چیز حاصل کرنے کے لیے بنایا گیا تھا Path۔ اس میں کوئی دوسری فعالیت نہیں ہے۔ یہاں ان کے کام کی ایک مثال ہے:
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، آئیے معلوم کریں کہ یہ کیا ہے Pathاور اس کی ضرورت کیوں ہے :)

راستہ

Path، بڑے پیمانے پر، کا ایک دوبارہ ڈیزائن کردہ اینالاگ ہے File۔ اس کے ساتھ کام کرنا بہت آسان ہے File۔ سب سے پہلے ، بہت سے افادیت (جامد) طریقوں کو اس سے ہٹا دیا گیا اور کلاس میں منتقل کر دیا گیا Files۔ دوم ، Pathطریقوں کی واپسی کی اقدار کا حکم دیا گیا تھا۔ کلاس میں، Fileطریقوں نے یہ واپس کر دیا String، وہ boolean، وہ File- یہ معلوم کرنا آسان نہیں تھا۔ مثال کے طور پر، ایک ایسا طریقہ تھا getParent()جس نے موجودہ فائل کے لیے بنیادی راستہ بطور سٹرنگ واپس کیا۔ لیکن ایک ہی وقت میں ایک طریقہ تھا getParentFile()جس نے وہی چیز واپس کردی، لیکن ایک چیز کی شکل میں File! یہ واضح طور پر بے کار ہے۔ لہذا، انٹرفیس میں، فائلوں کے ساتھ کام کرنے کا Pathطریقہ getParent()اور دیگر طریقے آسانی سے کسی چیز کو واپس کرتے ہیں Path۔ اختیارات کا کوئی ڈھیر نہیں - سب کچھ آسان اور آسان ہے۔ اس کے کیا مفید طریقے ہیں Path؟ یہاں ان میں سے کچھ اور ان کے کام کی مثالیں ہیں:
  • 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"));
       }
    }

    کنسول آؤٹ پٹ:

    جھوٹ
    سچ

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

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

آئیے ان طریقوں کو دیکھتے ہیں:
  • 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());
       }
    }

    کنسول آؤٹ پٹ:

    سچ ہے

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

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

    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\مثالیں
    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

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

فائلوں

Files- یہ ایک یوٹیلیٹی کلاس ہے جہاں کلاس سے جامد طریقے منتقل کیے گئے تھے File۔ Files- یہ تقریباً یکساں ہے Arraysیا Collections، صرف یہ فائلوں کے ساتھ کام کرتا ہے، نہ کہ صفوں اور مجموعوں کے ساتھ :) یہ فائلوں اور ڈائریکٹریوں کے انتظام پر مرکوز ہے۔ جامد طریقوں کا استعمال کرتے ہوئے Files، ہم فائلوں اور ڈائریکٹریوں کو تخلیق، حذف اور منتقل کر سکتے ہیں۔ ان کارروائیوں کے لیے طریقے استعمال کیے جاتے ہیں 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 {

       //file creation
       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 directory
       Path testDirectory = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory"));
       System.out.println("Was the directory successfully created?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory")));

       //move file from desktop to testDirectory. You need to move with the name of the file in the folder!
       testFile1 = Files.move(testFile1, Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt"), REPLACE_EXISTING);

       System.out.println("Is our file left 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")));

       //remove 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")));
   }
}
یہاں ہم سب سے پہلے ڈیسک ٹاپ پر ایک فائل (method Files.createFile()) بناتے ہیں، پھر وہاں فولڈر بناتے ہیں (method Files.createDirectory())۔ اس کے بعد، ہم فائل (method Files.move()) کو ڈیسک ٹاپ سے اس نئے فولڈر میں منتقل کرتے ہیں، اور آخر میں ہم فائل (method Files.delete()) کو حذف کر دیتے ہیں۔ کنسول آؤٹ پٹ: کیا فائل کامیابی کے ساتھ بنائی گئی تھی؟ true کیا ڈائریکٹری کامیابی کے ساتھ بنائی گئی تھی؟ true کیا ہماری فائل اب بھی ڈیسک ٹاپ پر ہے؟ غلط کیا ہماری فائل کو testDirectory میں منتقل کر دیا گیا ہے؟ true کیا فائل اب بھی موجود ہے؟ جھوٹا توجہ فرمایے:انٹرفیس کے طریقوں کی طرح Path، بہت سے طریقے Filesکسی چیز کو واپس کرتے ہیںPath ۔ زیادہ تر طبقاتی طریقے 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 {

       //file creation
       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 directory
       Path testDirectory2 = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2"));
       System.out.println("Was the directory successfully created?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2")));

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

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

       System.out.println("Has our file been copied to testDirectory?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2\\testFile111.txt")));
   }
}
کنسول آؤٹ پٹ: کیا فائل کامیابی کے ساتھ بنائی گئی تھی؟ true کیا ڈائریکٹری کامیابی کے ساتھ بنائی گئی تھی؟ true کیا ہماری فائل اب بھی ڈیسک ٹاپ پر ہے؟ true کیا ہماری فائل 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);
       }
   }
}
کنسول آؤٹ پٹ: مجھے ایک حیرت انگیز لمحہ یاد ہے: آپ میرے سامنے نمودار ہوئے، ایک لمحاتی وژن کی طرح، خالص خوبصورتی کے ذہین کی طرح۔ بہت آرام سے! :) یہ فیچر جاوا 7 میں نمودار ہوا۔ جاوا 8 میں، Stream API نمودار ہوا ، جس نے جاوا میں فنکشنل پروگرامنگ کے کچھ عناصر کو شامل کیا۔ امیر فائل مینجمنٹ کی صلاحیتوں سمیت. تصور کریں کہ ہمارے پاس ایک کام ہے: ایک فائل میں تمام لائنیں تلاش کریں جو لفظ "کیسے" سے شروع ہوتی ہے، انہیں UPPER CASE میں تبدیل کریں اور کنسول میں آؤٹ پٹ کریں۔ 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("How")) {
               String upper = s.toUpperCase();
               result.add(upper);
           }
       }

       for (String s: result) {
           System.out.println(s);
       }
   }
}
کنسول آؤٹ پٹ: روزہ رکھنے والے وژن کی طرح، خالص خوبصورتی کے جینیئس کی طرح۔ ایسا لگتا ہے کہ ہم نے یہ کر لیا ہے، لیکن کیا آپ کو نہیں لگتا کہ اتنے آسان کام کے لیے ہمارا کوڈ تھوڑا سا... لفظی نکلا؟ جاوا 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("How"))
               .map(String::toUpperCase)
               .collect(Collectors.toList());
       result.forEach(System.out::println);
   }
}
ہم نے وہی نتیجہ حاصل کیا، لیکن بہت کم کوڈ کے ساتھ! مزید یہ کہ یہ نہیں کہا جا سکتا کہ ہم "پڑھنے کی اہلیت" میں کھو چکے ہیں۔ میرے خیال میں آپ آسانی سے اس پر تبصرہ کر سکتے ہیں کہ یہ کوڈ کیا کرتا ہے، چاہے آپ Stream API سے واقف نہ ہوں۔ لیکن مختصر میں، ایک سلسلہ عناصر کا ایک سلسلہ ہے جس پر آپ مختلف افعال انجام دے سکتے ہیں۔ ہمیں طریقہ سے اسٹریم آبجیکٹ ملتا ہے Files.lines()اور پھر اس پر 3 فنکشن لاگو ہوتے ہیں:
  1. طریقہ استعمال کرتے ہوئے، filter()ہم فائل سے صرف وہی لائنیں منتخب کرتے ہیں جو "کیسے" سے شروع ہوتی ہیں۔

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

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

باہر نکلنے پر ہمیں ایک ہی نتیجہ ملتا ہے: روزہ رکھنے والے وژن کی طرح، خالص خوبصورتی کے جینئس کی طرح۔ اگر آپ اس لائبریری کی صلاحیتوں کے بارے میں مزید جاننے میں دلچسپی رکھتے ہیں، تو ہم اس مضمون کو پڑھنے کی تجویز کرتے ہیں ۔ ہم اپنی بھیڑوں کی طرف واپس جائیں گے، یعنی فائلز :) آخری امکان جس پر ہم آج غور کریں گے وہ فائل ٹری سے گزرنا ہے ۔ جدید آپریٹنگ سسٹم میں فائل کا ڈھانچہ اکثر درخت کی شکل اختیار کرتا ہے: اس کی جڑ ہوتی ہے اور شاخیں ہوتی ہیں جن سے دوسری شاخوں کو الگ کیا جا سکتا ہے، وغیرہ۔ ڈائریکٹریز جڑ اور شاخوں کا کردار ادا کرتی ہیں۔ مثال کے طور پر، ڈائریکٹری " C:// " روٹ کے طور پر کام کر سکتی ہے ۔ اس سے دو شاخیں نکلتی ہیں: " C://Downloads " اور " C://Users "۔ ان شاخوں میں سے ہر ایک سے 2 مزید شاخیں ہیں: “ C://Downloads/Pictures ”, “ C://Downloads/Video ”, “ C://Users/JohnSmith ”, “ C://Users/Pudge2005 ” . ان شاخوں وغیرہ سے دوسری شاخیں شاخیں نکلتی ہیں۔ - اس طرح ایک درخت نکلتا ہے۔ لینکس میں بھی ایسا ہی نظر آتا ہے، وہاں صرف ڈائرکٹری روٹ کے طور پر کام کرتی ہے / فائلز، پاتھ - 2 اب تصور کریں کہ ہمارے پاس ایک کام ہے: روٹ ڈائرکٹری کو جانتے ہوئے، ہمیں اس سے گزرنا ہوگا، تمام سطحوں کے فولڈرز کو تلاش کرنا ہوگا اور ان میں مواد کے ساتھ فائلیں تلاش کرنا ہوں گی۔ ہمیں ضرورت ہے. ہم ان فائلوں کو تلاش کریں گے جن میں یہ لائن ہوگی "یہ وہ فائل ہے جس کی ہمیں ضرورت ہے!" ہماری روٹ ڈائرکٹری "ٹیسٹ فولڈر" فولڈر ہوگی، جو ڈیسک ٹاپ پر واقع ہے۔ اس کے اندر درج ذیل مواد ہیں: فائلز، پاتھ - 3فولڈرز لیول 1-اے اور لیول 1-بی کے اندر فولڈرز بھی ہیں: فائلز، پاتھ - 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("Required file found!");
               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());
   }
}
کنسول آؤٹ پٹ: مطلوبہ فائل مل گئی ہے! C:\Users\Username\Desktop\testFolder\FileWeNeed1.txt مطلوبہ فائل مل گئی! C:\Users\Username\Desktop\testFolder\level1-a\level2-aa\FileWeNeed2.txt مطلوبہ فائل مل گئی! C:\Users\Username\Desktop\testFolder\level1-b\level2-bb\FileWeNeed3.txt بہت اچھا، ہم نے یہ کیا! :) اگر آپ اس کے بارے میں مزید جاننا چاہتے ہیں walkFileTree()تو میں آپ کو اس مضمون کی سفارش کرتا ہوں ۔ آپ ایک چھوٹا سا کام بھی مکمل کر سکتے ہیں - اسے SimpleFileVisitorایک باقاعدہ سے بدل دیں FileVisitor، تمام 4 طریقوں کو نافذ کریں اور اس پروگرام کے لیے ایک مقصد کے ساتھ آئیں۔ مثال کے طور پر، آپ ایک ایسا پروگرام لکھ سکتے ہیں جو آپ کے تمام اعمال کو لاگ کرے گا: کنسول میں فائل یا فولڈر کا نام داخل کرنے سے پہلے/بعد میں ڈسپلے کریں۔ بس یہی ہے - بعد میں ملتے ہیں! :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION