التعامل مع مكتبت الملفات io ؟
قبل الولوج الى الدرس 😄 المرجو مراجعة الدروس السابقة :
في اساس البرمجة هي تواجد مدخل يتم حجزه ثم عملية حوسبية وفي الاخير النتيجة المرجوة من البرنامج ، هو نفس الامر بالنسبة للملفات فقط نحن سنتعامل مع تدفق للبيانات حيث سنخصص هذه التدوينة في كل ما يخص التعامل مع مكتبة الملفات في اطار 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 main( String[] 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 main( String[] 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 main( String[] 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 = (char) data;
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 main( String[] 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 = (char) data;
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 main( String[] 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 ID, String 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();
}
}
}
الى هنا انتها شرحنا لاساسيات التعامل مع الملفات في الجافا
0 تعليقات