5 العنصر الخامس : سلسلة تعلم الجافا "التعامل مع الملفات"

 التعامل مع مكتبت الملفات io ؟

قبل الولوج الى الدرس 😄 المرجو مراجعة الدروس  السابقة  : 

1 العنصر الأول: سلسلة تعلم لغة الجافا من الصفر " تعريف "

في اساس البرمجة هي تواجد  مدخل يتم  حجزه ثم  عملية  حوسبية  وفي  الاخير  النتيجة المرجوة  من البرنامج  ،  هو نفس  الامر بالنسبة للملفات فقط  نحن سنتعامل مع  تدفق  للبيانات  حيث سنخصص هذه التدوينة في كل ما  يخص  التعامل مع مكتبة الملفات  في  اطار  java.io  وهي تنقسم الى  كلاسات اساسية  الاولى تبع المدخلات java.io.InputStream  والثانية مخصصة للمخرجات  java.io.OutputStream. وما تبقى فهي مكتبات  ثانوية تتفرع من هاتين المكتبتين .


هناك نوعين من الباكج او الحزم في jdk اختصار ل java develepmont kit   للتعامل مع الملفات

النوع الاول وهو الافتراضي المتواجد مع الحزم الاساسية تحت i/o  

النوع الثاني اكثر تخصصا وهو متواجد  باسم nio


انشاء ملف في الجافا 

لانشاء ملف في لغة الجافا يحتاج الى ثلاث طرق او اساليب 

 
File("file name")
File("Directory name")
File("directory name""Filename")

ثم  نستخدم دالة الانشاء ()file.createnewfile وهي دالة  منطقية  تعيد قيمة صحيح او خطا   true or false  

import java.util.*;
import java.io.*;
class TestClass{
  public static void mainString[] args )
  {
    try{
      File file = new File("C:\\test.txt");
      if (file.createNewFile()){ //return true
        System.out.println("New file is created!!");
      }else//return false
        System.out.println("test.txt already exists.");
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}


عملية الادخال  في ملف او input  على ملف 

سنحتاج الىInputStreamReader  حيث تقوم هذه الكلاس بقرائة مدخل حسب سعة البايت byte  وايضا تحويل الترميز حسب المدخلات وايضا الادخال  في الترميزات الخاصة بالخطوط مثلا :  

 
import java.util.*;
import java.io.*;
public class files{
  public static void mainString[] args ){
    try {
      InputStreamReader isReader = new InputStreamReader(System.in);
      BufferedReader bReader=new BufferedReader(isReader);
      System.out.println("Enter anything......");
      String data=bReader.readLine();
      System.out.println("You Entered.... "+data);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}


حيث سيعيد البرنامج اي  شيء  تكتبه  

ولقارئة  ملف محدد بالجافا نستخدم الطريقة التالية 

import java.io.*;
public class files{
  public static void mainString[] args ){
    try {
      InputStream is = new FileInputStream("E:\\test.txt");
      Reader isr = new InputStreamReader(is);
      int data = isr.read();
      while(data != -1){
        data = isr.read();
        char chr = (chardata;
        System.out.print(chr);
      }
      isr.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
  }
}


يمكنك استخدام المسار  الذي تريده  

وايضا يمكنك تحويل الترميز الضي تريده للنص عبر تحويله للبايت  

import java.io.*;
import java.nio.charset.StandardCharsets;
public class files{
  public static void mainString[] args ){
    try {
      String inputString = "This is a test !! ";
      InputStream is = new ByteArrayInputStream(inputString.getBytes(StandardCharsets.UTF_8));
      Reader isr = new InputStreamReader(is);
      int data = isr.read();
      while(data != -1){
        data = isr.read();
        char chr = (chardata;
        System.out.print(chr);
      }
      isr.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

وفي هذا  السطر قمت بتحويل  الصيغة عبر  البايت  

InputStream is = new ByteArrayInputStream(inputString.getBytes(StandardCharsets.UTF_8));


وهناك  ايضا طريقة لانشاء كائن جديد عبر كلاسة  OutPutStreamWriter وهي لها نفس  الخواص  فقط  تقوم بانشاء كائن جديد  حيث تضيف نص داخل  ملف txt 

import java.io.*;
public class files{
  public static void mainString[] args ){
    try {
      OutputStream  os = new FileOutputStream("E:\\test.txt");
      Writer osr = new OutputStreamWriter(os);
      osr.write("Java Stream handling !!");
      osr.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}


وللتعامل بشكل اكثر خوصصة  وتعمق هناك  كلاس Buffered readers  وهي تسمح بداتا اكثر وتقلل عدد الاستدعائات الى api وهي اسرع  وتسمح للتخزين العشوائي او الذاكرة المؤقة بالتعامل مع ملفات اكثر على القرص  الصلب  ستعطيك نفس  النتيجة  عند تجربة البرنامج  


import java.io.*;
public class TestClass{
  public static void main(String[] args) {
    BufferedReader br = null;
    try {
      br = new BufferedReader(new
      InputStreamReader(System.in));
      String str;
      str = br.readLine();
      System.out.println("You entered :: " + str);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if (br != null)
        br.close();
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }
}

وهذه الطريقة  للقراءة  من ملف خارجي  

 
import java.util.*;
import java.io.*;
public class TestClass{
  public static void main(String[] args) {
    BufferedReader br = null;
    try {
      String line;
      br = new BufferedReader(new FileReader("E:\\test.txt"));
      while ((line = br.readLine()) != null) {
        System.out.println(line);
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if (br != null)
        br.close();
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }
}


وهناك ايضا كلاس لا تقل عنها تميزا BufferedWriter وهي تختص بالكتابة على ملفات او اضافة مصفوفات لملفات  مثال 

import java.io.*;
public class TestClass{
  public static void main(String[] args) {
    try {
      String weekdays[] = {"Monday",
                            "Tuesday",
                            "Wednsday",
                            "Thursday",
                            "Friday"};
      File file = new File("E:\\test.txt");
      FileWriter fw = new FileWriter(file);
      BufferedWriter bw = new BufferedWriter(fw);
      for(int i=0;i<weekdays.length;i++){
        bw.write(weekdays[i]);
        bw.newLine();
      }
      bw.flush();
      bw.close();
      fw.close();
    }
    catch (IOException e){
    e.printStackTrace();
    }
  }
}


ويمكن الكتابة  على الملفات  الخارجية ايضا بكل  ارياحية بالطريقة التالية  :  

import java.io.*;
public class TestClass{
  public static void main(String[] args) {
    try {
    String weekdays[] = {"Saturday",
                          "Sunday"};
    File file = new File("E:/test.txt");
    FileWriter fw = new FileWriter(file,true);
    BufferedWriter bw = new BufferedWriter(fw);
    for(int i=0;i<weekdays.length;i++){
      bw.write(weekdays[i]);
      bw.newLine();
    }
      bw.flush();
      bw.close();
      fw.close();
    }
    catch (IOException e){
      e.printStackTrace();
    }
  }
}


هناك كلاس باسم  FileReader   وتقوم باحتساب كل حرف بالبايت  او  اكثر  لذا يفضل استخدام  كلاس  اخرى  مثل InputStreamReader لانها اكثر سلاسة  لكن فضلت الا اخفي هذه الكلاس رغم قلة استخدامها من قبل  المبرمجين  ولسيما  اثناء  التعلم في  الكليات للتعرف على الملفات وفهمها  

import java.util.*;
import java.io.*;
public class TestClass{
  public static void main(String[] args) {
    try {
      FileReader fileReader = new FileReader("D:\\test.txt");
      int chr = fileReader.read();
      while(chr != -1) {
        System.out.print((char) chr);
        chr = fileReader.read();
      }
    }
    catch (IOException e){
      e.printStackTrace();
    }
  }
}


وهناك  ايضا كلاس مشابه لها  وهو يعمل على الكتابة  داخل  الملف ويتعامل ايضا مع كل حرف حسب البايت FileWriter  وهي ايضا ليس  بالخيار الافضل  للتعامل مع الملفات  ويستحسن استخدام في برامجكم OutputStreamWriter   لانها  افضل واكثر مرونة  


import java.util.*;
import java.io.*;
public class TestClass{
  public static void main(String[] args) {
    try {
      FileWriter fw = new FileWriter("D:\\test.txt",true);
      fw.write("Line No. 5");
      fw.write("Line No. 6");
      fw.close();
    }
    catch (IOException e){
      e.printStackTrace();
    }
  }
}


وهناك كلاس  تسمح لك بالولوج بشكل عشوائي  للملفات   RandomAccessFile  حيث يوفر وصولاً غير متسلسل إلى الملفات.  و يتصرف مثل مجموعة كبيرة من البايتات المخزنة في نظام الملفات. هذا يعني أنك لست بحاجة إلى البدء من السطر الأول ويمكنك الانتقال إلى أي مكان في الملف. إنه مشابه لهيكل بيانات المصفوف ، تمامًا كما يمكنك الوصول إلى أي عنصر في مصفوفة حسب الفهرس ، يمكنك قراءة أي محتوى من ملف باستخدام مؤشرات الملف. الميزة الحقيقية هي أنه بمجرد فتح الملف ، يمكن قراءته أو كتابته بطريقة عشوائية فقط باستخدام رقم سجل أو يمكنك الإضافة في نهاية الملف 

"r"   :يستخدم لقراءة الملف فقط

"rw"  : له الصلاحية للفراءة  والكتابة .

"rws" : لديه افضلية المزامنة  والكتابة والقراءة

"rwd" : يمكن تقليل عمليات الادخال والمخرجات  وله الاحقية للكتابة  والقراءة


 
import java.util.*;
import java.io.*;
public class TestClass{
  public static void main(String[] args) {
    try {
        RandomAccessFile raFile =new RandomAccessFile("D://test.txt","rw");
        raFile.write("Java Tutorial".getBytes()); //add the content
        raFile.seek(raFile.getFilePointer()-8); //set pointer backward -8 characters
        raFile.write("File Class Tutorial ".getBytes()); //write the text where pointer is
        raFile.seek(0); //set pointer to start of file
        int i;
      while((i= raFile.read())!=-1){
        System.out.print((char)i);
      }
    }
    catch (IOException e){
    e.printStackTrace();
    }
  }
}


في اغلب هذه الاكواد يتم  تخزين في الذاكرة العشوائية  لسيما  ان  كان الكود داخلي وليس ملف نصي يتم الاقحام عليه  ،  الان يمكننا  الاضافة والتعديل على التخزين الدائم   ،  الامر الذي يسعنا  لتحويله  الى  كائن  لديه  معرف واسم  وغير ذالك 

import java.util.*;
import java.io.*;
class Student implements java.io.Serializable {
  int ID;
  String Name;
  Student(int IDString Name){
    this.ID = ID;
    this.Name=Name;
  }
  public String toString() {
    return "ID:" + ID + "\nName: " + Name;
  }
}
public class TestClass{
  public static void main(String[] args) {
    Student st1 = new Student(100"Bill");
    Student st2 = new Student(101"Gates");
    //writing Object to file
    try {
      FileOutputStream fos = new FileOutputStream(new File("D:\\javaObjects.txt"));
      ObjectOutputStream oos = new ObjectOutputStream(fos);
      // Write objects to file
      oos.writeObject(st1);
      oos.writeObject(st2);
      oos.close();
      fos.close();
    }
    catch (IOException e){
      e.printStackTrace();
    }
    //Read objects from file
    try{
      FileInputStream fis = new FileInputStream(new File("D:\\javaObjects.txt"));
      ObjectInputStream ois = new ObjectInputStream(fis);
      Student s1 = (Student) ois.readObject();
      Student s2 = (Student) ois.readObject();
      System.out.println(s1.toString());
      System.out.println(s2.toString());
      fis.close();
      ois.close();
    }catch(Exception ex){
      ex.printStackTrace();
    }
  }
}


يمكنك عمل سكانر  او الماسح  الضوئي  للنص  في  الجافا  تنتمي هذه الفئة من الكلاسات   الى  util  والتي تتيج للمستخدم قراءة قيم مختلفة  هذه الطريقة   لقراءة  نص داخلي  من خلال  الماسح الضوئي 

public class TestClass{
  public static void main(String[] args) {
    try {
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter first number...");
      int num1 = sc.nextInt();
      System.out.println("Enter second number...");
      int num2 = sc.nextInt();
      System.out.println("Sum is  : " + (num1+num2));
    }
    catch (Exception e){
      e.printStackTrace();
    }
  }
}


وهذه الطريقة  لقرائة  الماسح من  خلال   ملف  خارجي 


import java.util.*;
import java.io.*;
public class TestClass{
  public static void main(String[] args) {
    try {
      File file = new File("d:\\test.txt");
      Scanner scan = new Scanner(file);
      while (scan.hasNextLine()) {
        String line = scan.nextLine();
        System.out.println(line);
      }
      scan.close();
    } catch (Exception e){
      e.printStackTrace();
    }
  }
}


هذه الطريقة  لقراءة جميع الملفات  داخل مجل او مجلد فرعي 


import java.util.*;
import java.io.*;
public class TestClass{
  void fileList(File dir) {
    for (File fileEntry : dir.listFiles()) {
      if (fileEntry.isDirectory()) {
        fileList(fileEntry);
      } else {
        System.out.println(fileEntry.getName());
      }
    }
  }
  public static void main(String[] args) {
    try {
      File dir = new File("D:\\data");
      TestClass tc = new TestClass();
      tc.fileList(dir);
    }
      catch (Exception e){
    e.printStackTrace();
    }
  }
}


وهذه الطرثقة   لقرائة  نوع  محدد  من الملفات  داخل مجلد  معين  



import java.util.*;
import java.io.*;
public class TestClass{
  void fileList(File dir) {
    for (File fileEntry : dir.listFiles()) {
      if (fileEntry.isDirectory()) {
        fileList(fileEntry);
      } else {
      if (fileEntry.isFile() && fileEntry.getName().endsWith(".txt")) {
        System.out.println(fileEntry.getName());
      }
      }
    }
  }
  public static void main(String[] args) {
  try {
    File dir = new File("D:\\docs");
      TestClass tc = new TestClass();
      tc.fileList(dir);
    }
    catch (Exception e){
      e.printStackTrace();
    }
  }
}


ويمكنك ايضا حساب  الملفات  في مجلد بالجافا 


 
 
import java.util.*;
import java.io.*;
public class TestClass{
  public static void main(String[] args) {
  try {
      File file[] =  new File("d:\\test").listFiles();
      int count = file.length;
      System.out.println("Total no. of files : " + count);
    }
    catch (Exception e){
      e.printStackTrace();
    }
  }
}


الى  هنا  انتها  شرحنا  لاساسيات التعامل مع الملفات في  الجافا 


Post a Comment

1 Comments

  1. Our Call Girls in Goa service will provide oral and anal sex facilities also by trained and experienced girls.Call Girls in Goa We have also most of the clients who wish to take these girls for business purposes such that Call Girls in Goa business tour client meetings and presentations also where Call Girls in Goa they can enjoy each and every moment with confidence and they will make his dignity Call Girls in Goa against their business partner.

    ReplyDelete