CodeGym /جاوا بلاگ /Random-SD /جاوا فائلون، رستو
John Squirrels
سطح
San Francisco

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

گروپ ۾ شايع ٿيل
سلام اڄ اسان فائلن ۽ ڊائريڪٽرن سان ڪم ڪرڻ بابت ڳالهائينداسين. توھان اڳ ۾ ئي ڄاڻو ٿا ته فائل جي مواد کي ڪيئن منظم ڪجي: اسان ھن لاءِ ڪيترائي سبق وقف ڪيا آھن :) مان سمجھان ٿو توھان کي انھن مقصدن لاءِ استعمال ٿيل ڪجھ طبقن کي ياد ڪرڻ آسان لڳندو. اڄ جي سبق ۾، اسان خاص طور تي فائل مئنيجمينٽ بابت ڳالهائينداسين: ٺاهڻ، نالو تبديل ڪرڻ، وغيره. جاوا 7 کان اڳ، اهي سڀئي آپريشن فائل ڪلاس استعمال ڪندي ڪيا ويندا هئا. توھان ان بابت پڙھي سگھوٿا هتي . پر جاوا 7 ۾، ٻولي جي تخليق ڪندڙن فيصلو ڪيو ته اسان ڪئين فائلن ۽ ڊائريڪٽرن سان ڪم ڪريون. اهو ٿيو ڇاڪاڻ ته فائل ڪلاس ۾ ڪيترائي خرابيون هيون. مثال طور، ان ۾ ڪاپي () طريقو نه هو ، جيڪو توهان کي هڪ فائل کي هڪ هنڌ کان ٻئي ڏانهن نقل ڪرڻ جي اجازت ڏيندو (هڪ بظاهر ضروري صلاحيت). ان کان سواء، فائل ڪلاس ۾ ڪافي ڪجھ طريقا آھن جيڪي بولين قدر واپس آڻيندا آھن. جڏهن هڪ غلطي آهي، اهڙي طريقي سان غلط موٽائي ٿي. اهو هڪ استثنا نه ٿو اڇلائي، اهو تمام ڏکيو آهي غلطين کي سڃاڻڻ ۽ انهن جي سببن جي تشخيص ڪرڻ. ھڪڙي فائل ڪلاس جي جڳھ ۾، 3 ڪلاس ظاهر ٿيا: رستا ، رستو ، ۽ فائلون . يقينن، صحيح هجڻ لاء، رستو هڪ انٽرفيس آهي، نه ڪلاس. اچو ته اهو ڄاڻون ته اهي هڪ ٻئي کان ڪيئن مختلف آهن ۽ اسان کي انهن مان هر هڪ جي ضرورت آهي. اچو ته آسان سان شروع ڪريون: رستا .

رستا

رستا ھڪڙو سادو ڪلاس آھي ھڪڙو جامد طريقي سان: 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 جي ڀيٽ ۾ ڪم ڪرڻ تمام آسان آهي . پهريون ، ڪيترائي يوٽيلٽي (جامد) طريقا ڪڍيا ويا ۽ فائل ڪلاس ۾ منتقل ڪيا ويا. ٻيو ، آرڊر رستي جي انٽرفيس جي طريقن جي واپسي جي قيمتن تي لاڳو ڪيو ويو . فائل ڪلاس ۾ ، طريقا واپس آيا يا ته هڪ اسٽرنگ ، يا هڪ بوليان ، يا هڪ فائل . اهو سمجهڻ آسان نه هو. مثال طور، اتي ھڪڙو getParent() طريقو آھي جيڪو ھڪڙي اسٽرنگ کي موجوده فائل جي والدين رستي جي نمائندگي ڪري ٿو. پر اتي ھڪڙو getParentFile() طريقو پڻ ھو، جيڪو ساڳيو شيء واپس آيو پر ھڪڙي فائل اعتراض جي صورت ۾! اهو واضح طور تي بيڪار آهي. ان جي مطابق، پاٿ انٽرفيس ۾ ، getParent() طريقو ۽ فائلن سان ڪم ڪرڻ جا ٻيا طريقا صرف هڪ 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"));
       }
    }

    ڪنسول آئوٽ:

    
    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 " جو مطلب آهي ته موجوده ڊاريڪٽري ۾ هڪ "تصويرون" فولڊر آهي، جنهن جي نتيجي ۾ هڪ "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\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

رستي جي طريقن جي مڪمل فهرست ڪافي ڊگھي آھي. توھان انھن سڀني کي Oracle دستاويزن ۾ ڳولي سگھو ٿا . هاڻي اسان فائلن تي غور ڪرڻ لاء اڳتي وڌنداسين .

فائلون

فائلون ھڪڙو افاديت وارو طبقو آھي جيڪو جامد طريقن کي رکي ٿو فائل ڪلاس مان ڪڍيو ويو. فائلن جي مقابلي ۾ آهي Arrays يا مجموعا . فرق اهو آهي ته اهو فائلن سان ڪم ڪري ٿو، نه arrays يا مجموعو :) اهو فائلن ۽ ڊائريڪٽرن کي منظم ڪرڻ تي ڌيان ڏئي ٿو. فائل ڪلاس جي جامد طريقن کي استعمال ڪندي، اسان فائلون ۽ ڊائريڪٽري ٺاهي، ختم ڪري، ۽ منتقل ڪري سگھون ٿا. اهي عمل ٺاهيا ويندا آهن 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، ڪلاس جا ڪيترائي طريقا 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 {

       // 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
هاڻي توهان کي خبر آهي ته ڪيئن فائلن کي ڪاپي ڪرڻ لاء programmatically! :) يقينا، 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 ۾ ظاهر ٿيو. اهو جاوا ۾ فنڪشنل پروگرامنگ جا ڪجهه عنصر شامل ڪري ٿو. جنهن ۾ وڌيڪ فائل هينڊلنگ صلاحيتون شامل آهن. تصور ڪريو ته اسان وٽ ھيٺيون ڪم آھي: سڀئي لائينون ڳولھيو جيڪي لفظ "جيئن" سان شروع ٿيون، انھن کي 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);
   }
}
اسان ساڳيو نتيجو حاصل ڪيو، پر تمام گهٽ ڪوڊ سان! وڌيڪ ڇا آهي، ڪو به اهو نٿو چئي سگهي ته اسان "پڙهڻ جي صلاحيت" وڃائي ڇڏيو آهي. مان سمجهان ٿو ته توهان آساني سان تبصرو ڪري سگهو ٿا ته هي ڪوڊ ڇا ڪندو آهي، جيتوڻيڪ اسٽريم 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" فولڊر، جيڪو ڊيسڪ ٽاپ تي آهي، روٽ ڊاريڪٽري طور. هتي ان جا مواد آهن: فائلون، رستو - 3ليول1-a ۽ ليول1-b فولڊر پڻ فولڊر تي مشتمل آهن: فائلون، رستو - 4فائلون، رستو - 5انهن "سيڪنڊ ليول فولڊر" ۾ ڪو به فولڊر نه آهي، صرف انفرادي فائلون: فائلون، رستو - 6فائلون، رستو - 73 فائلون جن جي اسان کي ضرورت آهي انهن کي عمدي طور وضاحتي نالا ڏنا ويا آهن: 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