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

عندما نريد كتابة File لماذا يجب علينا أن نستخدم throws & Exception

بدأه Al-waleed في 3 يناير 2011 · 6 رد · 636 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

}

package File4;

import java.io.*;

public class TestFileOutputStream {

	public static void main(String[]arg) throws Exception{

		File F=new File("Sample3.data");
		FileOutputStream Fo=new FileOutputStream(F);
		FileInputStream Fi=new FileInputStream(F);

		byte B[]={1,4,7};
		Fo.write(B);

		Fo.close();

		int FileSize=(int)F.length();
		byte d[]=new byte[FileSize];
		Fi.read(d);
		for(int i=0;i<FileSize;i++){
			System.out.println(d);
		}
		Fi.close();



	}

}

كما تلاحظون لماذا يجب علينا أن نكتب بعد main

throws Exception

شاكرين لكم :)

#2

بالإضافة لماذا استخدمنا

byte b[]={1,2,3};

لماذا لا يمكننا أن نستخدم int بدلا من byte

تم تعديل هذه المشاركة بواسطة Al-waleed في 3 يناير 2011 في 23:30

#3

انت قومت بكتابه

throws Exception

لانك لم تفعل

try...catch

فى الداله

لان عمليه القرائه تلقى

IOException

وانت قومت بالقائه

انما بالنسبه للكتابه

هو المستخدم عاوز يكتب bytes

وليس int

دا حسب احتياجك فى البرنامج

بالتوفيق

Software Developer
Mahmoudkelany.com


 

#4
Mahmoud Kelany كتب:

انت قومت بكتابه

throws Exception

لانك لم تفعل

try...catch

فى الداله

لان عمليه القرائه تلقى

IOException

وانت قومت بالقائه

انما بالنسبه للكتابه

هو المستخدم عاوز يكتب bytes

وليس int

دا حسب احتياجك فى البرنامج

بالتوفيق

طيب ما لماذا نستخدم try , و catch ؟!

ثاني أنا كتبت int بدلا من byte لكن خرج لي خطاء :( .

أشكرك

#5

فائدة الـException في حال حصل خطأ غير متوقع فهنا تحدد للبرنامج كيف يتصرف في هذه الحاله , مثلاً هنا لو ماكان الملف اللي كتبت أسمه موجود فهنا سيحدث Exception

أما بالنسبة لكتابة throws بعد أسم أي دالة سواء الـmain أوغيرها فهذا يعني انه عند أستدعاء هذه الدالة من أي مكان آخر سوف تلزمك أن تحصرها داخل try-catch والا بيطلعلك Error

مثلاً :

public void methodA() throws Exception{

//Your code
}

public void invokeMethodA(){

try{
methodA();
}
catch(Exception ex){
//Something wrong happened
}

}

داخل الـcatch تحدد مالذي تريد تنفيذه في حال وقوع خطأ أثناء تنفيذ الكود الذي كتبته في الـ try (مثلاً تظهر رسالة خطأ أو اي شئ آخر), أما إذا حبيت تستدعيها بدون try-catch وحبيت تستدعي الداله من داخل دالة الـmain فيكفي تكتب throws Exception جنب دالة الـmain مثل الطريقة اللي سألت عنها انت فوق

بس الأسلم أنك تكتبها داخل try-catch :)

تم تعديل هذه المشاركة بواسطة M.Allaw في 4 يناير 2011 في 00:24


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#6

نستخدم try catch لمعالجة الحالات الإستثنائي، بحيث تضع داخل ال catch الكود المناسب لك حالة.

مثلا ال constructor الخاص ب FileOutputStream يرسل FileNotFoundException في حال كان الملف مجلدا، أو لم يكن موجودا وتعذر إنشائه، أو لا يمكن فتحه لسبب ما

http://download.oracle.com/javase/6/docs/api/java/io/FileOutputStream.html#FileOutputStream(java.io.File)

اقتباس
Throws:

FileNotFoundException - if the file exists but is a directory rather than a regular file, does not exist but cannot be created, or cannot be opened for any other reason

بالنسبة لكتابة مصفوفة ال bytes، فإن الملفات أصلا هي عبارة عن سلسلة من ال bytes. توجد طربقة لكتابة int، وليس مصفوفة int.

write(int)

#7

احب ان اضيف معلومه بسيطه:

كما قال الاستاذ عصام فإن الملفات هي اصلا سلسله من الbytes (كأي I/O stream اخر) ويمكن كتابتها/قراءتها بإحدى طريقتين , اما كمصفوفات او كbytes منفرده , وهناك اختلاف طفيف ولكن مهم بين الطريقتين.

الداله

read(byte[])

تستخدم لقراءه مصفوفه من byte والداله

 read(int )

تستخدم لقراءه byte واحد , هذه الداله لا تقرأ int وانما byte بصوره int , وحتى اكون دقيقا فهي تقرأ unsigned byte in the range of 0-255 , هذه الداله لا تعيد ابدا قيمه خارج النطاق 0-255 واللذي هو نطاق الbyte اي من 00000000 الى 11111111 .

معروف ان الbyte في Java هو اصلا signed value اي ان قيمته تتراوح مابين 128- الى 127+. ولكن عند التعامل مع I/O يفضل تمثيل الbyte كint عند التعامل معه بصوره منفرده وبالتالي يتم التعبير عنه كقيمه unsigned تترواح مابين 0-255 (Java convention ).

(لا توجد داله في I/O API تتعامل مع byte واحد بل يتم استخدام int للتعبير عنه)

طيب , متى يتم التعامل مع الbyte كما هو ؟ اي ك signed value ؟ ..صحيح .. في المصفوفات فقط.

ولذلك لاحظ ان:

الداله read(int) تقوم بقراءه byte واحد ثم تقوم بتحويله الىunsigned value قبل ارجاعه على صوره int حسب المعادله التاليه

int unsignedByte = signedByte >= 0 ? signedByte : 256 + signedByte;

طيب ماذا يحدث اذا قام احدهم بإستدعاء write(45655) على ملف ؟؟ طبعا سيتم تحويل القيمه الى signed byte قبل كتابتها للstream حسب المعادله التاليه:

int byteValue;
int temp = intValue % 256;
if ( intValue < 0) {
  byteValue =  temp < -128 ? 256 + temp : temp;
}
else {
  byteValue =  temp > 127 ? temp - 256 : temp;
}

او كما نعرفه بال casting.

byte b=(byte)45655

public class TestFileInputStream {

    public static void main(String[] args) throws IOException {
        File file = File.createTempFile("file", ".txt");
        file.deleteOnExit();
        FileOutputStream output = new FileOutputStream(file);
        FileInputStream input = new FileInputStream(file);

        //WRONG, don't use signed bytes except when writing array of bytes!
        for (int i = -128; i <= 127; i++) {
            output.write(i);
        }

 		//WRONG, out of range
 		for (int i = 256; i < 512; i++) {
              output.write(i);
          }
          //CORRECT
          for (int i = 0; i < 256; i++) {
   			output.write(i);
   		}
        output.close();

        int a = 0;


        while ((a = input.read()) != -1) {
            System.out.println(a);
        }
        input.close();
    }
}

سلام

1

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

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