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

خطأ في كود i\o Files والاكسبشن

بدأه ηaseemЈava في 15 نوفمبر 2013 · 11 رد · 602 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لدي ملفين أحدهما لكتابة سجلين من البيانات من نوع formatted file data

والاخر لقراءة السجلين الذين تم كتابتهما في الملف الأول

 

هذا كود ملف القراءة

عند التنفيذ يظهر لي رسالة الاكسبشن

File not found

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class MailOrderRead {

	public static void main(String[] args) {

		int x = 0,x2,y = 0,y2 = 0;
		try {
			
			DataInputStream read = new DataInputStream(new FileInputStream(new File("c:\\test\\mailOrder.txt").getName()));
			DataInputStream read2 = new DataInputStream(new FileInputStream(new File("c:\\test\\mailOrder2.txt").getName()));
			System.out.println("Item number\t Quantity");
			for (int i = 0; i < 2; i++) {
				 x = read.readInt();
				 x2 = read.readInt();
				if(i == 1)
				{
					 y = read2.readInt();
					 y2 = read2.readInt();
				}
				System.out.println(x + "\t" + x + "\n" + y + "\t" + y2);
			}
			
			read.close();
			read2.close();

		}catch (FileNotFoundException ex) {
			System.out.println("File not found");

		} catch (IOException ex) {          
			System.out.println("problem found while reading that file.");
		}
	}

}

ساعدونا في تصحيح الكود؟

 

===================

 

وهذا الكود عن IOException

لا يعمل بشكل صحيح

import java.io.IOException;
import java.util.Scanner;
public class Test {

	public static void main(String[] args) throws IOException {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("Enter id number");		
		try {
			int id = sc.nextInt();
		} catch (IOException e) {
		    System.out.println("not valid");
	}
}

}

تحياتي

تم تعديل هذه المشاركة بواسطة ηaseemЈava في 15 نوفمبر 2013 في 15:59

#2

البدء بالتحية جميل ... ^_^

 

أولا  هل تقصدين القراءة من الملف الأول وكتابة ما قرأته في الملف الثاني.. فحينئذ استعملي  DataInpuStream للقراءة من الأول   و  DataOutputStream للكتابة في الثاني

 

ثالثا IOexeption لا يجوز في لغة الجافا أن تأتي في جسم try و catch

 

أعيدي وسنصحح إن شاء الله

تم تعديل هذه المشاركة بواسطة أحمد أبو عبد البر في 15 نوفمبر 2013 في 17:24

1

vVIfFr.gif

مدونتي



إذا رأيتموني غبت فأطلت الغياب فربما أكون قد انتقلت عن الدنيا إلى الآخرة

فما أحوجني إلى دعوة صالحة من أخ لي كريم

 

http://www.tvquran.com/

 

LoGeCom

أول برنامج عربي للمحاسبة والتجارة وإدراة المخازن يعمل على اللينكس والماك والويندوز 

#3

السلام عليكم

 

بالنسبة للكود الأول, لا داعي لاستخدام الدالة getName, احذفيها و سيعمل الكود (لا أدري هل سيؤدي المطلوب, لكنه سيعمل على كل حال !)

بالنسبة للكود الثاني, لا أدري كيف يُمكن أن تحصلي على استثناء من نوع IOException ! لو وضعتِ استثناء من نوع InputMismatchException لكان منطقيا  لكن IOException لا أراه مناسباً ..

 

 

 

تحياتي.

1
#4
أحمد أبو عبد البر كتب:

البدء بالتحية جميل ... ^_^

 

أولا  هل تقصدين القراءة من الملف الأول وكتابة ما قرأته في الملف الثاني.. فحينئذ استعملي  DataOutputStream للقراءة من الأول   و DataInpuStream للكتابة في الثاني

 

ثالثا IOexeption لا يجوز في لغة الجافا أن تأتي في جسم try و catch

 

أعيدي وسنصحح إن شاء الله

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

عادة ما ابدأ بالسلام ولكن هذه المرة نسيت ^_^

لعلك قصدت بأن  DataOutputStream  للكتابة و DataInpuStream للقراءة

 

قصدت بهذا الأمر

DataInputStream read = new DataInputStream(new FileInputStream(new File("c:\\test\\mailOrder.txt").getName()));

أن أحصل على اسم الملف الأول الذي تمت فيه كتابة المدخلات

لا أدري ان كان الأمر صحيحاً

============

أما IOException

فاستخدامه بالنسبة لي غير واضح

اذا تفضلت ووضحت

تم تعديل هذه المشاركة بواسطة ηaseemЈava في 15 نوفمبر 2013 في 17:26

#5
Snack3r كتب:

السلام عليكم

 

بالنسبة للكود الأول, لا داعي لاستخدام الدالة getName, احذفيها و سيعمل الكود (لا أدري هل سيؤدي المطلوب, لكنه سيعمل على كل حال !)

بالنسبة للكود الثاني, لا أدري كيف يُمكن أن تحصلي على استثناء من نوع IOException ! لو وضعتِ استثناء من نوع InputMismatchException لكان منطقيا  لكن IOException لا أراه مناسباً ..

 

 

 

تحياتي.

 

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

استخدمت هذه الدالة لكي استرجع فقط اسم الملف الذي سبق وتم انشاؤه

 

بخصوص ال IOException

أردت أن يظهر البرنامج خطأ إذا أدخل المستخدم قيمة ليست رقم صحيح

أليس هذا النوع من الاكسبشن يستخدم لهكذا غرض بالاضافة لاستخدامه عند التعامل مع الملفات؟

 

عدلت الكود بالاكسبشن الذي أشرت إليه وظهر خطأ

شكراً لك

#6

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

اقتباس

 

 

لعلك قصدت بأن  DataOutputStream  للكتابة و DataInpuStream للقراءة

نعم ذلك ما قصدت وصححته  

 

 

اقتباس

 

قصدت بهذا الأمر

DataInputStream read = new DataInputStream(new FileInputStream(new File("c:\\test\\mailOrder.txt").getName()));

أن أحصل على اسم الملف الأول الذي تمت فيه كتابة المدخلات

لا أدري ان كان الأمر صحيحاً

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

والمعنى أنشأت كائن ملف غير موجود أصلا

 

بل الصحيح أن تتم الكتابة قبل القراءة

 

اقتباس

 

أما IOException

فاستخدامه بالنسبة لي غير واضح

اذا تفضلت ووضحت

معنى كلامي الأول أنه لا يجوز أن تستعمل الصيغة التالية

try {
			
                     }
                catch (IOException e) {
		    
                }

وإنما نستعمل

throws IOException

بعد اسم method

vVIfFr.gif

مدونتي



إذا رأيتموني غبت فأطلت الغياب فربما أكون قد انتقلت عن الدنيا إلى الآخرة

فما أحوجني إلى دعوة صالحة من أخ لي كريم

 

http://www.tvquran.com/

 

LoGeCom

أول برنامج عربي للمحاسبة والتجارة وإدراة المخازن يعمل على اللينكس والماك والويندوز 

#7
اقتباس

قصدت بهذا الأمر

DataInputStream read = new DataInputStream(new FileInputStream(new File("c:\\test\\mailOrder.txt").getName()));

أن أحصل على اسم الملف الأول الذي تمت فيه كتابة المدخلات

لا أدري ان كان الأمر صحيحاً

 

الأمر صحيح لكن ليس في محله لأن الـ constructor التابع لـ FileInputStream يأخذ كائن من نوع File و ليس String.

 

اقتباس

بخصوص ال IOException

أردت أن يظهر البرنامج خطأ إذا أدخل المستخدم قيمة ليست رقم صحيح

أليس هذا النوع من الاكسبشن يستخدم لهكذا غرض بالاضافة لاستخدامه عند التعامل مع الملفات؟

 

لا ! الـ IOException خاص باستثناءات الـ I/O التي تحدث عند التعامل مع الملفات.

إذا أردت إصدار exception إذا أدخل المستخدم قيمة بدلا من عدد فاستخدم InputMismatchException.

تم تعديل هذه المشاركة بواسطة Snack3r في 15 نوفمبر 2013 في 17:46

#8
أحمد أبو عبد البر كتب:

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

نعم ذلك ما قصدت وصححته  

 

 

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

والمعنى أنشأت كائن ملف غير موجود أصلا

 

بل الصحيح أن تتم الكتابة قبل القراءة

 

معنى كلامي الأول أنه لا يجوز أن تستعمل الصيغة التالية

try {
			
                     }
                catch (IOException e) {
		    
                }

وإنما نستعمل

throws IOException

بعد اسم method

 

أستاذي عملية الكتابة تمت بالفعل

وكما وضحت في صلب الموضوع بأن لدي ملفين

الأول تتم فيه عملية الكتابة

والأخر للقراءة وهذا الملف هو الذي فيه الاشكال

الاشكال كيف أحصل على اسم الملف الأول الذي تمت فيه الكتابة

واستخدمه في الملف الثاني المخصص لقراءة مدخلات الملف الأول

الأخ snack3r فهم قصدي جيداً ^_^

شكراًجزيلاً

#9
Snack3r كتب:

الأمر صحيح لكن ليس في محله لأن الـ constructor التابع لـ FileInputStream يأخذ كائن من نوع File و ليس String.

 

لا ! الـ IOException خاص باستثناءات الـ I/O التي تحدث عند التعامل مع الملفات.

إذا أردت إصدار exception إذا أدخل المستخدم قيمة بدلا من عدد فاستخدم InputMismatchException.

 

بخصوص الاكسبشن

اشتغل الكود

 

اما بخصوص هذا الامر

DataInputStream read = new DataInputStream(new FileInputStream(new File("c:\\test\\mailOrder.txt").getName()));

فهل فقط احذف الدالة getName()؟

اذا ممكن تصويب الأمر لاستراجاع اسم الملف الآخر

لأنه عند حذف الدالة وعند التنفيذ

يظهر في الoutput

 

Item number     Quantity

problem found while reading that file.

#10
  1. المفروض تستخدم DataInputStream للملف الأول و DataOutputStream للملف الثاني و لا تنسى أيضاً استخدام FileOutputStream بدلا من FileInputStream.
  2. من غير المنطقي استخدام readInt مع الملف الثاني لأنه للكتابة فقط.

أعد كتابة الكود من جديد و سأساعدك للوصول إلى الحل.

تم تعديل هذه المشاركة بواسطة Snack3r في 15 نوفمبر 2013 في 18:48

#11
Snack3r كتب:

 

  1. المفروض تستخدم DataInputStream للملف الأول و DataOutputStream للملف الثاني و لا تنسى أيضاً استخدام FileOutputStream بدلا من FileInputStream.
  2. من غير المنطقي استخدام readInt مع الملف الثاني لأنه للكتابة فقط.

أعد كتابة الكود من جديد و سأساعدك للوصول إلى الحل.

 

 

1. أنا استخدمت DataInputStream للملف الأول وستجد ذلك في الكود الذي في صلب الموضوع

الخطأ هو في أمر جلب الملف الأول وخزنه في المتغير read

 لم اضع في الموضوع كلا الملفين، وضعت فقط ملف القراءة ..

2.إذا تم تصحيح الأمر

DataInputStream read = new DataInputStream(new FileInputStream(new File("c:\\test\\mailOrder.txt").getName()));

فان المتغير read سيحتقظ بالقيم التي تم كتابتها في الملف الأول

وعندها سيعمل اللوب for

هكذا يخيل لي وقد يكون هناك خطوات أخرى لتحقيق المطلوب

 

هل أضع كود ملف الكتابة ؟؟

 

وايضا لماذا استخدم DataOutputStream للملف الثاني

إذا هذا الكود مخصص فقط للقراءة؟

اتمنى توضيح قصدك وتبيين الخلل في فهمي

تم تعديل هذه المشاركة بواسطة ηaseemЈava في 15 نوفمبر 2013 في 19:11

#12

لا يُمكنني فهم المطلوب إذا كان الكود ناقص :)

 

كنتُ أظن أنك تعمل على ملفين في نفس الوقت, الأول تكتب فيه مجموعة بيانات و الثاني تُخزن فيه ما كُتب في الملف الأول, إذا كان فهمي صحيح فأخبرني لنكمل بقية النقاش اعتمادا على هذا.

لكن حسب ما فمهته من كلامك الأخير أنك تُريد قراءة ملف موجود مُسبقا و بالتالي إذا كان هذا الحال فلا أرى فائدة في إنشاء كان من DataOutputStream لأن الملف موجود مُسبقاً.

 

وضح المطلوب أكثر و ضع الكود كاملا حتى أفهم ما تريد الوصول إليه.

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