الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

نظره على I/O in Java

مغلق
بدأه زائر في 2 مايو 2007 · 22 رد · 11,392 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هلا والله شباب ، أول شي I/O موضوع كبير ومتشعب وانا ماعرف فيه كثير ،

مهمتي في هذا الموضوع شرح كيفية القرائه والكتابه من الملفات ببرنامج عادي

أي أننا لن نتطرق إلى , DataInputStram , DataOutputStream

أو FileInputStream & FileOutputStream

بالمناسبه انا قرأت بأن هذين الكلاسين مناسبين جداً لمسألة استغلال البيانات المشفره ، من لديه معلومه ؟

هل لأنهم يتعاملون مع bytes ?

ولن نتطرق إلى ObjectOutputStream ,,plaplapla

طيب اجل وش تبي تشرح :angry:

class File , FileWriter , FileReader , BufferedWriter , BufferedReader

لن تحتاج سوا إلى BufferedWriter , BufferedReader ولكن للفهم الصحيح ادخلت الباقي

في الحقيقه أن BufferedWriter & BufferedReader جائت كـ Wrappering لـ FileWriter & FileReader

File ببساطه هذا قاعدة الclasses اللي تشتغل عليهن في برامجك ، فهو لايحتوي على مثد للقرائه أو للكتابه ،

باستطاعتك ان تنشأ منه ملف بواسطة constructor :

File f=new File("a.txt");

في الكود السابق قمت بإنشاء ملف اسمه a ، لكن بالحقيقه انت لم تنشأ شئ حتى الآن ( بامكانك التأكد بالذهاب إلى مجلد مشروعك والبحث عن الملف لن تجده )

مالحل ؟

الحل هو مناداة المثد createNewFile لإنشاء الملف فيزيائياً لذلك ستجده موجود في المجلد

public class Main {

	public static void main(String[] args) throws IOException {
	File f=new File("a");
	f.createNewFile();
	}

}

هذا الكلاس يمكنك من إنشاء ملف أو directory بنفس الاوبجكت

طيب وش الmethods المهمه في هذا الكلاس ؟ :huh: :huh:

boolean delete()

لحذف الملف ترجع صح إذا كان الملف مو قيد التشغيل ببرنامج آخر ،أو إذا كان directory فاضي

boolean exists()

ترجع صح إذا كان الملف موجود ،

boolean mkDir()

لجعل الاوبجكت Directory وليس ملف

int length()

لإرجاع طول الملف

، طيب اوكي الحين FileWriter

FileWriter & FileReader يتعاملون مع characters وليس مع bytes مثلFileInputStream & FileOutputStream

بمعنى أن في كل الحالات التعامل يتم عن طريق integers تكتب ، ولكن في FileWriter & FileReader يتم الكتابه والقرائه على أساس أن الارقام هي char

مثال

public class Main {

	public static void main(String[] args) throws IOException {
 FileWriter fw=new FileWriter("aa");
 fw.write("Oops ,, Aha !!");
 fw.flush();

	}

}

قمنا بإنشاء ملف اسمه aa ومن ثم الكتابه فيه ومن ثم دفع الchars للتأكد بأنها كتبت بالملف

flush تستخدم لدفع الchars الموجوده في الستريم وكتابتها إلى الملف ،

طبعاً بامكانك استبدال السترنق OOps,,Aha بأي جمله أو بArray of char

public class Main {

	public static void main(String[] args) throws IOException {
		char[] c=new char[10];
 FileWriter fw=new FileWriter("aa");
 fw.write(c);
fw.flush();

	}

}

الكود السابق سيكتب 10 فراغات في الملف :lol:

طيب نروح للأخ المحترم FileReader :unsure:

لا لا مايحتاج نروح للي بعده ( لأننا فهمنا مضمونه فهو عكس FileWriter )

#2

BufferedWriter

راح يقول احدكم : والله ياخي انت ازعجتنا ، وش هالتعقيد هذا ، flush وماني عارف ايش ، ياأخي ماصارت :angry:

فأقول له : إبتسم أخي فأنت في منتدى الجافا

إبتسم إبتسم

:lol: :lol: :lol:

BufferedWriter مثل ماقلنا سابقاً هو جاء ليغطي تعقيد FileWriter ويستخدم بشكل أكثر مرونه ،

باستطاعتك انشاء constructor الذي يستقبل FileWriter :

BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));

ومن ثم يمكنك الكتابه في الملف واذا اردت سطر جديد لك ان تستدعي الداله newLine ،

مثال

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
 BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));
 bw.write("Hello");
 bw.newLine();
 bw.write("World");
bw.close();
	}

}

المثال السابق سيكتب بالملف Hello بسطر World بسطر آخر ،

هلا لاحظت الفرق كيف ، في FileWriter كان لابد ان تكتب بين كل كلمه والأخرى \n عشان تقول ان هذا سطر جديد ، هنا فقط بمناداة الداله ،

كذلك لاتحتاج إلى دفع البيانات flush فهو يقوم بدفعها implicitly

طيب ، فهمنا ياخي ، بس نبي نضيف على البيانات الموجوده قبل بالملف ، وشلون ؟

المسأله بسيطه كل ماعليك هو إعلام الFileWriter بأن المستخدم باستطاعته عمل append لهذا الملف

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
 BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt",true));
 bw.write("Hello");
 bw.newLine();
 bw.write("World");
bw.close();
	}

}

سوف يظهر لك Hello بسطر ثم WorldHello بسطر ثم World بسطر آخر ،

اعتقد لاتحتاج إلى تفسير لأنه لم نعمل newLine إلا بعد كتابة كلمة Hello ، فلذلك كتب WorldHello ورى بعض

طيب اووكي ، زين الحين نبي قراءة الملف كيف ؟؟

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new FileReader("a.txt"));

String in;
while((in=br.readLine())!=null)
	System.out.println(in);

	}}

المثال السابق قرئنا الملف سطر سطر .

#3

طيب نبي نقرا من الكونسول مانبي من ملف ، وشلون ؟

فيه اكثر من طريقه ،

فيه عن طريق BufferedReader اللي يقرا من InputStramReader

مثال

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s="";
while(s!=null){
s=br.readLine();
System.out.println(s);
}
	}}

في المثال السابق كل كلمه تكتبها بالكونسول تطبع ، طبعاً بامكانك تغيير الطباعه لتفعل ماتريد ، كتابتها في ملف أو أي شئ آخر

طيب الطريقه الثانيه الجديده هي من الكلاس Scanner :

import java.io.*;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws IOException {
 Scanner sc=new Scanner(System.in);
 String out="";
 while(sc.hasNext())
out+=" "+sc.next();
 System.out.println(out);

	}}

المهم في Scanner هو انه عندما تستدعي hasNext فإن مؤشر cursor الملف لايتقدم ، فقط يتأكد بأنه يوجد بيانات بعدها ويرجع true ،

لكن في next or nextInt فالمؤشر يتحرك .

#4

مارأيكم ، بنظره على الكلاس RandomAccessFile

import java.io.*;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws IOException {
 RandomAccessFile raf=new RandomAccessFile("ooh.txt","rw");
raf.writeUTF("Hello");
raf.writeInt(1);
raf.seek(0);
while(raf.getFilePointer()!=raf.length())
{
	System.out.println(raf.readUTF());
	System.out.println(raf.readInt());
}

	}}

اول شي قمنا بانشاء ملف واعطاء الصلاحيه بالكتابه والقرائه عليه rw ،

وبامكانك التأكد باستخدام صلاحيه غير معطاه مثل أن تقوم بالكتابه وانت معطي صلاحيه فقط r

 RandomAccessFile raf=new RandomAccessFile("ooh.txt","r");

بإمكاننا كتابة أي primitive data عن طريق استدعاء المثد المناسبه ، writeUTF تستخدم لكتابة String

قمنا فيما بعد بإرجاع cursor إلى بداية الملف عن طريق المثد seek ، ومهمة هذه المثد هي نقل cursor من مكان إلى آخر ، بناءاً على القيمه

while(raf.getFilePointer()!=raf.length()

getFilePointer ترجع long عباره عن مكان cursor الحالي ، وطالما أنه لايساوي طول الملف إذاً يوجد بيانات

readUtf تقرأ String وتقوم بازاحة cursor بقدر هذا الString

#5

تصدق،، بالتو عرفت كيف أستخدم RandomAccessFile!

كنت أستخدمه قديما في QBasic... وحاولت استخدامه في Java وما عرفت ولا بحثت!

بالتوفيق!

#6

هلا والله ابو مازن ،

شهاده اعتز فيها ، يعني اسلوبي واضح :unsure:

#7

حلوين ..

ننتظر DataInputStram , DataOutputStream لو بشكل موجز !!

#8

www.google.com

ان اشكل عليك كود ، جب الكود هنا ونشرحه

#9

File

FileWriter

FileReader

BufferedWriter

BufferedReader

Scanner

RandomAccessFile

هذا ماتم شرحه في الموضوع ، إن اردتوا اضافه او إشكاليه ، فأهلاً وسهلاً

لكن غالباً لن تحتاجوا غير ماتم شرحه خاصة BufferedReader , BufferedWriter

#10

أهلاً أخي ،

أولاً ، طالما اننا نعلم ولسنا مشغولين فمن واجبنا ان نقدم الخدمه لأخواننا المسلمين .

الشئ الآخر ، الله يعلم بأنني لاأملك مصدر اكتب منه ، ولكن فقط NetBeans لأتأكد من كل الاكواد التي اطرحها ، فجل من لايسهو

الشئ الأخير هو أنني نقطه في بحر هؤلاء : أبو مازن ، مجدي ، رامي ، ناردين ، ابو الفؤاد

بالنسبه لـStringToknizer من اسمه فهو يقطع السترنق إلى قطع أصغر بناءاً على delimiter معين ،

الـdefault delimiter هو الـspace

مثال :

import java.util.StringTokenizer;
class A{
	public static void main(String... args){
		StringTokenizer st=new StringTokenizer("arab team 2000");
		while(st.hasMoreTokens())
			System.out.println(st.nextToken());
	}
}

يطبع arab بسطر team بسطر 2000 بسطر آخر ،

الدوال اعتقد انها واضحه

بامكانك التعويض عنه باستخدام الداله split في الكلاس String

class A{
	public static void main(String... args){
	   String[] st="arab team 2000".split("\\s");
	   for(int i=0;i<st.length;i++)
	 System.out.println(st);
	}
}

يطبع نفس المثال الأول بـStringToknizer

s\\ هو الdelimiter الخاص بالفراغ ، d\\ هو الخاص بالارقام ، سأكتب موضوع في الايام القادمه عن Regular Expression regex

#11

لأنك تستخدم JDK1.4

#12

إيه الابداع ده يا بو عيسي، يومين و خلص إمتحانات و ابدأ اشاركك في إبداعاتك

بجد المواضبع اللب إنت بتعرضها جامده جدا ،

exceptions, IO و يسلام بقي لو شوية threads بس أخلص أنا إمتحانات و أفضي ، دعواتكم معانا يا رجاله :D

#13

وعليكم السلام ورحمة الله وبركاته

صباح الخير اخي الكريم ، كيف حالك ؟

تفضل ، ومتأسف للتأخير ، حمل JDK1.6 فهو يحتوي على كل ماتريد .

http://java.sun.com/javase/downloads/index.jsp

اذا كنت تبي تحمل فقط JDK1.6 ( بمعنى لديك IDE like NetBeans )

قم بتحميل JDK 6u1 ، وبعد ان يكتمل التحميل إذهب الى خصائص برنامجك وابحث عن خاصيه للـJDK وضع المجلد هناك ،

اما اذا تبي تحمل JDK+IDE ، قم بتحميل JDK 6u1 with NetBeans 5.5 ،

مع تمنياتنا بقضاء أجمل الاوقات ... :)

أخوك / عيسى

#14

جزاك الله خير

كم كنت أحتاج لمثل هذا الشرح :ty:

مدونتي

برمجة وما يتبعها

#15

شرح رائع ومجهود كبير ......... جزاك الله خير وجعله في يمزان حسناتك وننتظر المزيد

للعلم اني سجلت في المنتدى مخصوص بسبب هذا الشرح الجميل..... يا ريت لا تحرمنا منه استاذنا عيسى

#16

السلام عليكم ...

أخي أنا عندي مشروع أتممته ومخرجاته هي جدول يحتوي على مساقات الطالب .. ولكن أريد أن أطبع هذا الملف في ملف نصي (txt) وذلك باستخدام ال File

أرجو أن تشرحلي كيفية تعريف هذا الملف وكيفية كتابة الكود ..

أريده أن يطبع هذا في ملف txt

System.out.printf("Name : "+s[1]+" "+s[2]+"\nID: "+s[3]+" \n");
                           System.out.printf("\n               8-9           9-10         10-11       12-13         13-14         14-15\n");
                           System.out.printf("       ________________________________________________________________________________________\n");
                           System.out.printf("  sat  |%-20s%-20s%-20s%-20s%-20s\n",table[1][1],table[1][2],table[1][3],table[1][4],table[1][5],table[1][6]);
                           System.out.printf("  sun  |%-20s%-20s%-20s%-20s%-20s\n",table[2][1],table[2][2],table[2][3],table[2][4],table[2][5],table[2][6]);
                           System.out.printf("  mon  |%-20s%-20s%-20s%-20s%-20s\n",table[3][1],table[3][2],table[3][3],table[3][4],table[3][5],table[3][6]);
                           System.out.printf("  tus  |%-20s%-20s%-20s%-20s%-20s\n",table[4][1],table[4][2],table[4][3],table[4][4],table[4][5],table[4][6]);
                           System.out.printf("  wed  |%-20s%-20s%-20s%-20s%-20s\n",table[5][1],table[5][2],table[5][3],table[5][4],table[5][5],table[5][6]);
                           System.out.printf("  thi  |%-20s%-20s%-20s%-20s%-20s\n",table[6][1],table[6][2],table[6][3],table[6][4],table[6][5],table[6][6]);
                           System.out.printf("  fri  |%-20s%-20s%-20s%-20s%-20s\n",table[7][1],table[7][2],table[7][3],table[7][4],table[7][5],table[7][6]);
#17

موضوع جدا رائع . :happy: .

وانا عندي مشاكل :wacko: في نفس الموضوع

ياليت تشوفه وتوضحلي المشاكل اللي عندي ..

/index.php?showtopic=219041

#18

أرني محاولاتك وسوف أساعدك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#19
علاء الصالحي كتب:

أرني محاولاتك وسوف أساعدك

تحياتي

اذا كنت تقصدني فلو سمحت اضغط ع اللنك وشوف محاولاتي

وانا حقيقي محتاجه مساعده ..لأني تعبت وانا ادور ع هذا الموضوع

وجزيتم خيرا ان شاء الله

#20

أقصد محاولاتك في كتابة ملف بعد أن قرأتي هذا الموضوع

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#21

اقرأي الموضوع يا اختي

والله رح تستفيدي بمشروعك و بالمستقبل

و تفهمي الجزيئة بشكل جيد جدا

#22

قمت بنقل المشاركة إلى موضوعك

/index.php?showtopic=219041

برجاء الرد هناك

تحياتي

تم تعديل هذه المشاركة بواسطة علاء الصالحي في 21 أبريل 2010 في 22:25

#23

تبرك الله شرح ولا اروع

الله يعطيك العافية اخي

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


هذا الموضوع مغلق.

مواضيع مشابهة