JavaRush /جاوا بلاگ /Random-SD /جاوا فائلون، رستو

جاوا فائلون، رستو

گروپ ۾ شايع ٿيل
سلام! اڄ اسان فائلن ۽ ڊائريڪٽرن سان ڪم ڪرڻ بابت ڳالهائينداسين. توھان اڳ ۾ ئي ڄاڻو ٿا ته فائلن جي مواد کي ڪيئن منظم ڪجي: اسان وٽ ڪيترائي ڪلاس آھن جيڪي ھن لاءِ وقف ڪيا ويا آھن :) مان سمجھان ٿو توھان آساني سان ياد ڪري سگھوٿا ڪيترائي ڪلاس جيڪي انھن مقصدن لاءِ گھربل آھن. اڄ جي ليڪچر ۾ اسان خاص طور تي فائل مينيجمينٽ بابت ڳالهائينداسين - ٺاهڻ، نالو تبديل ڪرڻ، وغيره. جاوا 7 کان اڳ، اهڙيون سڀئي آپريشنون استعمال ڪندي ڪيون ويون آهن File. توهان هن جي ڪم بابت هتي پڙهي سگهو ٿا . پر جاوا 7 ۾، ٻولي جي ٺاهيندڙن کي تبديل ڪرڻ جو فيصلو ڪيو ته اهي فائلن ۽ ڊائريڪٽرن سان ڪيئن ڪم ڪن. ان جو سبب اهو هو ته طبقن ۾ Fileڪيتريون ئي خرابيون هيون. مثال طور، اهو ڪو طريقو نه هو copy()جيڪو توهان کي اجازت ڏئي ها ته هڪ فائل کي هڪ هنڌ کان ٻئي ڏانهن نقل ڪري (هڪ ظاهري طور تي واضح طور تي گهربل خصوصيت). ان کان علاوه، ڪلاس Fileوٽ ڪافي طريقا آھن جيڪي موٽايا ويا boolean-values. جيڪڏهن ڪو نقص ٿئي ٿو، ته اهڙو طريقو غلط ثابت ٿئي ٿو بجاءِ استثنيٰ، جنهن ڪري غلطين جي تشخيص ۽ انهن جي سببن جو تعين ڪرڻ تمام ڏکيو آهي. ھڪڙي طبقي جي بدران، File3 طبقن جا ڪيترائي ظاھر ٿيا 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, by and large, is a redesigned analogue of the 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 " جو مطلب آهي ته ڊاريڪٽري ۾ اسان هاڻي آهيون، اتي هڪ تصوير فولڊر آهي، ۽ ان ۾ هڪ فائل آهي "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: \ استعمال ڪندڙ \ مثال

  • 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));
       }
    }

    ڪنسول آئوٽ:

    يوزر نالو\Desktop\testFile.txt

طريقن جي مڪمل فهرست Pathڪافي وڏي آهي. توھان انھن سڀني کي Oracle دستاويزن ۾ ڳولي سگھو ٿا . اسان جائزو وٺڻ لاء اڳتي وڌنداسين 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")));
   }
}
هتي اسان پهرين ڊيسڪ ٽاپ تي هڪ فائيل (طريقي) ٺاهي Files.createFile()، پوءِ اتي فولڊر ٺاهيو (طريقي Files.createDirectory()). ان کان پوء، اسان فائل (طريقو Files.move()) کي ڊيسڪ ٽاپ کان هن نئين فولڊر ڏانهن منتقل ڪيو، ۽ آخر ۾ اسان فائل (طريقو Files.delete()) کي حذف ڪريون ٿا. ڪنسول آئوٽ: ڇا فائل ڪاميابي سان ٺاهي وئي؟ صحيح ڊاريڪٽري ڪاميابي سان ٺاهي وئي؟ صحيح ڇا اسان جي فائل اڃا تائين ڊيسڪ ٽاپ تي آهي؟ false ڇا اسان جي فائل testDirectory ۾ منتقل ڪئي وئي آهي؟ صحيح ڇا فائل اڃا موجود آهي؟ ڪوڙو توجهه ڏيو:بس انٽرفيس طريقن وانگر 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")));
   }
}
ڪنسول آئوٽ: ڇا فائل ڪاميابي سان ٺاهي وئي؟ صحيح ڊاريڪٽري ڪاميابي سان ٺاهي وئي؟ صحيح ڇا اسان جي فائل اڃا تائين ڊيسڪ ٽاپ تي آهي؟ صحيح ڇا اسان جي فائل ڪاپي ڪئي وئي testDirectory؟ صحيح هاڻي توهان فائلن کي پروگرام طور نقل ڪري سگهو ٿا! :) پر ڪلاس 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 ۾، اسٽريم 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);
   }
}
اسان ساڳيو نتيجو حاصل ڪيو، پر تمام گهٽ ڪوڊ سان! ان کان سواء، اهو نه ٿو چئي سگهجي ته اسان "پڙهڻ" ۾ وڃائي ڇڏيو آهي. منهنجو خيال آهي ته توهان آساني سان تبصرو ڪري سگهو ٿا ته هي ڪوڊ ڇا ڪندو آهي، جيتوڻيڪ توهان اسٽريم 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 هاڻي تصور ڪريو ته اسان وٽ هڪ ڪم آهي: روٽ ڊاريڪٽري کي ڄاڻڻ، اسان کي ان ذريعي وڃڻ گهرجي، سڀني سطحن جي فولڊرن ۾ ڏسو ۽ انهن ۾ فائلون ڳوليو مواد سان. اسانکي ضرورت آهي. اسان انهن فائلن کي ڳوليندا سين جنهن ۾ ”هي اها فائل آهي جنهن جي اسان کي ضرورت آهي! اسان جي روٽ ڊاريڪٽري "testFolder" فولڊر هوندو، جيڪو ڊيسڪ تي واقع آهي. ان جي اندر ھيٺ ڏنل مواد آھي: فائلون، رستو - 3فولڊر اندر ليول 1-a ۽ ليول 1-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("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 گهربل فائل ملي وئي! ج: \ استعمال ڪندڙ \ صارف جو نالو \ ڊيسڪ ٽاپ \ ٽيسٽ فولڊر \ Level1-b \ Level2-bb \ FileWeNeed3.txt زبردست، اسان اهو ڪيو! :) جيڪڏھن توھان چاھيو ٿا وڌيڪ ڄاڻڻ جي باري ۾ walkFileTree()، مان توھان کي سفارش ڪريان ٿو ھي مضمون . توھان ھڪڙو ننڍڙو ڪم پڻ مڪمل ڪري سگھو ٿا - ان کي SimpleFileVisitorباقاعده ھڪڙي سان تبديل ڪريو FileVisitor، سڀني 4 طريقن تي عمل ڪريو ۽ ھن پروگرام لاء ھڪڙو مقصد ٺاھيو. مثال طور، توهان هڪ پروگرام لکي سگهو ٿا جيڪو توهان جي سڀني عملن کي لاگ ان ڪندو: فائل يا فولڊر جو نالو ڪنسول ۾ داخل ٿيڻ کان اڳ / بعد ۾ ڏيکاريو. اهو سڀ ڪجهه آهي - پوءِ ملنداسين! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION