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

اريد ان اعرف نهاية الفايل في الجافا

مغلق
بدأه تالا في 28 أبريل 2005 · 29 رد · 2,326 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عملت برنامج بالجافا يدخل المعلومات في ملف على شكل records

واستخدمت sequentianal file

وعندما اردت قراءة جميع الريكورد المخزنة بالملف لم اعرف الفنكشن التي تجد نهاية الملف كي اضعها في شرط while

واذا كانت هناك طريقة اخرى لايجاد النهاية فدلوني عليها

وجزاكم الله الف خير

#2

السلام عليكم

هناك عدة طرق يتم فيها استعمال كلاسات مختلفة للعمة على sequential files ولكل منها طريقة في التعرف اذا تم الوصول إلى نهاية الملف وذلك حسب الطرق التي توفرها الكلاسات المستعملة فمنها من يرمي استثناء ومنها من يرجع -1

والجواب يتعلق بالكلاسات المستعمالة وهل نستعمل مجرى حرفي أم مجرى بايتي فحدد الكلاسات لتحديد الاجابة

والسلام عليكم

#3

لم افهم المقصود من السؤال بالضبط

لكن استخدمت كلاس SERIZABLE

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

ويدخلها في الفايل كريكورد كامل

ثم يمسح النص بعد تخزينه في الفايل ليدع اليوزر يدخل نصا اخر ويحفظه في الفايل كريكورد اخر

#4

السلام عليكم

اعتقد ان العمل يتم على كائنات كلاس ما

ويتم استعمال ObjectInputStream مع readObject وعند الوصول إلى نهاية الملف سيرمي الاستثناء EOFException وحينئذ ترجع طريقة القراءة null

يمكن ان تتم القراءة بالصيغة التالية ان كانت الكلاس اسمها MyRecordClass

     

         FileInputStream  fileInput;
          ObjectInputStream  input;

try {

         fileInput = new FileInputStream( fileName );
         input = new ObjectInputStream( fileInput );

         // input the values from the file: object of class MyRecordClass 
         while ( true ) {
            // read one AccountRecord
            record = ( MyRecordClass ) input.readObject();

            // treatment of object
         
      } // end try

      // close file when end-of-file reached
      catch ( EOFException eofException ) {
         input.close();
      }

      // display error if cannot read object because class not found
      catch ( ClassNotFoundException classNotFound ) {
	// ...
      }

      // display error if cannot read because problem with file
      catch ( IOException ioException ) {
	// ...
      }

يمكن وضع input.close(); عملية اغلاق الملف في finally clause

#5

شكرا يا اخي

استخدمت نفس الطريقة..

لكن عندي مشكلة في القيمة المرجعة .. فانا اريد احصاء عدد الريكورد في الفايل

وعندما كنت ازود الكونتر في الوايل .. لا يعد بالطريقة الصحيحة ..

فهل هناك فنكشن لايجاد النهاية كما في c++

f.eof()

#6

السلام عليكم

لا اعرف اذا كان هناك طريقة خاصة مثل في س++ لمعرفة اذا وصلنا إلى نهاية الملف ام لا ولا اعتقد انه موجود شيء جاهز بجافا لان جافا تتعامل مع الملفات بطريقة تختلف عن س++

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

حاولي البحث في موقع sun علك تجدي معلومات افضل

JavaTM 2 Platform

بالتوفيق

#7

اشكرك مرة اخرى على المساعدة

سأحاول مراجعة الكود مرة اخرى .. لعل هناك خطأ منطقي

وبالنسبة للموقع فأنا دائمة الزيارة له ..

جزاك الله الف خير

#8

ضع الكود هنا حتى يمكن مساعدتك وتعم الفائدة للجميع

اما بالنسبة للعدد فيمكن ان تخزن الكائنات المقروءة من الملف في Vector ثم تستدعي الدالة size من هذا الVector

يمكن ان تسخدم طريقة الأخ khalil2005 مع مراعاة ان البرنامج يختبر المتغير record ان كان يساوي null فيخرج من حلقة التكرار.

والله يوفقك

تم تعديل هذه المشاركة بواسطة khwlani في 2 مايو 2005 في 23:11

اللهم انا نسألك علما نافعا ونعوذ بك من حماقة الجهلاء
#9

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

الاخ khwlani

بالنسبة للكود فلا استطيع وضعه لاني اعمل على كلاسات كثيرة مرتبطة ببعضها ..

اما بالنسبة للعد فالحمدلله اشتغل البرنامج

ولكن عندي مشلكة اني عندما اقرا من فايل انشئه لاول مرة ولم اعمله append فان البرنامج يشتغل بشكل سليم

ولكن المشكلة الكبيرة تحدث عند القراءة من ملف انشأته سابقا واضفت له ريكورد جديدة يعني append

يطلع ال exeption

error during read a file

هذا الكود لكن ماراح يشتغل لانه يحتاج كلاسات اخرى مرتبطة ..

اتمنى اعرف اذا في مشكلة اثناء الكتابة :

public class createstudentfile extends JFrame {
   private ObjectOutputStream output;
   private studenterUI userInterface;
   private JButton ExitButton, NextButton;
   public createstudentfile()
   {
    super( "Creating a Student File" );
    File file =getFile();
    openFile(file);
    userInterface = new studenterUI(2);
    
    getContentPane().add( userInterface, BorderLayout.CENTER );
    
    NextButton = userInterface.getDoTask1Button();
    NextButton.setText( "Next Student..." );
    // register listener to call openFile when button pressed
      NextButton.addActionListener(

         // anonymous inner class to handle openButton event
         new ActionListener() {

            // call openFile when button pressed
            public void actionPerformed( ActionEvent event )
            {
               addRecord();
            }

         } // end anonymous inner class

      ); // end call to addActionListener
      
      ExitButton = userInterface.getDoTask2Button();
      ExitButton.setText( "Finish" );
      //ExitButton.setEnabled( false );  // disable button
      
      // register listener to call addRecord when button pressed
      ExitButton.addActionListener(

         // anonymous inner class to handle enterButton event
         new ActionListener() {

            // call addRecord when button pressed
            public void actionPerformed( ActionEvent event )
            {
               if ( output != null )
               {
                  addRecord();
                }
                System.out.println("closing file on finish");
               closeFile();
            }

         } // end anonymous inner class

      ); // end call to addActionListener
      
  addWindowListener(

         // anonymous inner class to handle windowClosing event
         new WindowAdapter() {

            // add current record in GUI to file, then close file
            public void windowClosing( WindowEvent event )
            {
               if ( output != null )
               {
                  addRecord();
                }
             System.out.println("closing file win");
               closeFile();
            }

         } // end anonymous inner class

      ); // end call to addWindowListener 
      

      setSize( 300, 200 );
      setVisible( true );

   } // end constructor
   
   
   //////////////////////////////////////////////////////////////////////
   private void closeFile() 
   {
      // close file 
      try {
         output.close();
         System.exit( 0 );
      }

      // process exceptions from closing file 
      catch( IOException ioException ) {
         JOptionPane.showMessageDialog( this, "Error closing file", 
            "Error", JOptionPane.ERROR_MESSAGE );
         System.exit( 1 );
      }

   } // end method closeFile
   //////////////////////////////////////////////////////////////////////
    public void addRecord()
   {
      int studNumber = 0;
      studrec record;
      String fieldValues[] = userInterface.getFieldValues();
      // if account field value is not empty
      if ( ! (fieldValues[ userInterface.NAME ].equals( "" ) ) ){
              
         // output values to file
         try {
            studNumber = Integer.parseInt(fieldValues[ userInterface.ID ]);

            if ( studNumber > 0 ) {

               // create new record
               record = new studrec(fieldValues[studenterUI.NAME],studNumber,0);
               // output record and flush buffer
               
               output.writeObject( record );
              
               //System.out.println(studentcount);
               output.flush();
            }
            else
            {
                JOptionPane.showMessageDialog( this,
                   "Student number must be greater than 0",
                   "Bad Student number", JOptionPane.ERROR_MESSAGE );
            }

            // clear textfields
            userInterface.clearFields();

         } // end try

         // process invalid account number or balance format
         catch ( NumberFormatException formatException ) {
            JOptionPane.showMessageDialog( this,
               "Bad Student number ", "Invalid Number Format",
               JOptionPane.ERROR_MESSAGE );
         }

         // process exceptions from file output
         catch ( IOException ioException ) {
             JOptionPane.showMessageDialog( this, "Error writing to file",
                "IO Exception", JOptionPane.ERROR_MESSAGE );
            System.out.println("closing file");
            closeFile();
         }

     

   } 
   }// end method addRecord
   private File getFile()
   {
      // display file dialog, so user can choose file to open
      JFileChooser fileChooser = new JFileChooser();
      fileChooser.setFileSelectionMode( JFileChooser.FILES_ONLY );
      
      int result = fileChooser.showOpenDialog( this );

      // if user clicked Cancel button on dialog, return
      if ( result == JFileChooser.CANCEL_OPTION )
         return null;

      File fileName = fileChooser.getSelectedFile(); // get selected file
      
      // display error if invalid 
      if ( fileName == null || fileName.getName().equals( "" ) )
         {
          JOptionPane.showMessageDialog( this, "Invalid File Name", 
            "Invalid File Name", JOptionPane.ERROR_MESSAGE );
            return null;
        }

      else 
        return fileName;
      } 
            

  private void openFile(File F) 
  {      // open file
     try {
            output = new ObjectOutputStream(
               new FileOutputStream( F,true ) );

         }

         // process exceptions from opening file
         catch ( IOException ioException ) {
            JOptionPane.showMessageDialog( this, "Error Opening File", 
               "Error", JOptionPane.ERROR_MESSAGE );
         }  
     
  
   } // end method openFile 
   
    public   static void main( String args[] )
   {
      new createstudentfile();
   }

  }//end class
#10

الاحتمال الاكبر

هو انك لم تقوم باغلاق الملف المفتوح

تأكد من هذا الامر اولاً

لا بد من صنعاء وان طال السفر

#11

ExitButton.addActionListener(

// anonymous inner class to handle enterButton event

new ActionListener() {

// call addRecord when button pressed

public void actionPerformed( ActionEvent event )

{

if ( output != null )

{

addRecord();

}

System.out.println("closing file on finish");

closeFile();

}

} // end anonymous inner class

); // end call to addActionListener

في الكود هذا هو تفعيل الزر exit

ونقوم فيه باغلاق الملف عند النتهاء

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

وعشان كذا بيطلع الاكسبشن ..

ابغى اعرف حل المشكلة هذي

والف شكر على المساعدة

#12

من الأحتمال ان يكون الخطا في هذه الأسظر

String fieldValues[] = userInterface.getFieldValues();
     // if account field value is not empty
     if ( ! (fieldValues[ userInterface.NAME ].equals( "" ) ) ){
             
        // output values to file
        try {
           studNumber = Integer.parseInt(fieldValues[ userInterface.ID ]);

قد تكون القيمة المرجعة من getFieldValues تساوي null او قد

fieldValues[ userInterface.NAME ]=null

الأحتمال الثالث هو

 fieldValues[ userInterface.ID =null

ومن هنا يتوجب ما يلي ان تختبر ان كانت القيم == null

كما يفضل ان تكون العمليات داخل try

ان لم تكتشف الخطا فما عليك الأ ان تشغل البرنامج بال Debug وخطوة خطوة في هذا الدالة حتى تشاهد في اي سطر الأكسبشن

ـاكد من انك استخدمت Casting صح

تم تعديل هذه المشاركة بواسطة khwlani في 6 مايو 2005 في 00:11

اللهم انا نسألك علما نافعا ونعوذ بك من حماقة الجهلاء
#13

السلام عليكم

إن ما ذكره الاخ khwlani صحيح حيث يتم رمي استثناء عند العمل على مرجع null ولكن الاستثناء المذكور له علاقة بالقراءة من الملف وليس بمرجع null

في البرنامج المكتوب يتم التركيز على اسم الطالب وليس على الرقم كما هو الحال في البرنامج الاساسي الذي تم الاقتباس منه وفي البرنامج الاساسي يتم التأكد من ان الرقم اكبر من صفر ولا يشترط شيء على باقي البيانات، يمكن في طريقة قراءة الحقول getFieldValues التأكد من القيم المقروءة كي لا يصدر اخطاء جراء عدم توفير بيانات في المربعات النصية وكما يمكن وضع قيم افتراضية مكان البيانات الناقصة ولكن المشكلة عند قراءة الاوبجكتز من الملف هو ما ذكر

لا استطيع ان اكتشف الخطأ من خلال الكود الذي تم وضعه لأنه على ما يبدو سليم، ولا اعرف اذا ما كان نفس البرنامج يقوم بانشاء الملف اول مرة ثم القراءة منه ثم الاضافة عليه ثم القراءة ... فلا اعرف كيف تم تنظيم هذه العمليات، ومن الممكن ان يكون الخطأ من تتابع هذه العمليات.

فيمكن ان يكون الخطأ من هذا التسلسل بالانشاء ثم القراءة ثم الاضافة وإعادة القراءة حيث ربما لم يتم اغلاق الملف أو فتحه جيد

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

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

الله يكون بالعون

#14

السلام عليكم

البرنامج السابق ينشيء الملف فقط

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

اما البرنامج التالي فهو يقرأ الملف فقط ..لكني لا اتوقع ان هناك مشكلة فيه

وكما ذكرت :

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

لكن عند انشاؤه من اول مرة فانه يقرأه بشكل صحيح وبدون اي مشاكل

قد تكون المشكلة في عمليات الفتح والاغلاق ولكن اراها منطقية ..

وهذا برنامج القراءة وهو ايضا مقتبس من برنامج من كتاب java how to program

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class readstudentfile extends JFrame {
   private ObjectInputStream input;
   
/******************************************************************************/
   public readstudentfile()
   {  
      super( "Students List " );
     
      File file =getFile();
      openFile(file);
      // register window listener for window closing event
      addWindowListener(

         // anonymous inner class to handle windowClosing event
         new WindowAdapter() {

            // close file and terminate application
            public void windowClosing( WindowEvent event )
            {
               if ( input != null )
                  closeFile();

               System.exit( 0 );
            }

         } // end anonymous inner class

      ); // end call to addWindowListener

      // get reference to generic task button doTask2 from BankUI
      
       String[] columnNames = {"Student ID",
                        "Student Name",
                        "Student Grade"
                        };
                       
       int studc=0;
       
       do
       {
        studc++;
       }while(getStudCount());
       studc--;
       System.out.println("studc ="+studc); 
       closeFile();
       openFile(file);
       Object[][] data =new Object[studc][3];
       for (int i=0; i<studc;i++)
          {
          String rec[] = readRecord();
          data[0]=rec[0];
          data[1]=rec[1];
          data[2]=rec[2];
         
          }//end for 1 
           
      
       final JTable table = new JTable(data, columnNames);
       table.setPreferredScrollableViewportSize(new Dimension(500, 70));
       table.setName("Student List ");
       JScrollPane scrollPane = new JScrollPane(table);
       getContentPane().add( scrollPane, BorderLayout.CENTER );
      
          
      pack();
      setSize( 650, 500 );
      setVisible( true );


     
   } // end constructor

/******************************************************************************/
   private File getFile()
   {
      // display file dialog, so user can choose file to open
      JFileChooser fileChooser = new JFileChooser();
      fileChooser.setFileSelectionMode( JFileChooser.FILES_ONLY );
      
      int result = fileChooser.showOpenDialog( this );

      // if user clicked Cancel button on dialog, return
      if ( result == JFileChooser.CANCEL_OPTION )
         return null;

      File fileName = fileChooser.getSelectedFile(); // get selected file
      
      // display error if invalid 
      if ( fileName == null || fileName.getName().equals( "" ) )
         {
          JOptionPane.showMessageDialog( this, "Invalid File Name", 
            "Invalid File Name", JOptionPane.ERROR_MESSAGE );
            return null;
        }

      else 
        return fileName;
      } 
            
/******************************************************************************/
  private void openFile(File F) 
  {      // open file
     try {
               input = new ObjectInputStream(
               new FileInputStream( F ) );

         }

         // process exceptions from opening file
         catch ( IOException ioException ) {
            JOptionPane.showMessageDialog( this, "Error Opening File", 
               "Error", JOptionPane.ERROR_MESSAGE );
         }  
     
  
   } // end method openFile 
   
/******************************************************************************/
   // read record from file
   public String[] readRecord()
   {
      studrec record;
      // input the values from the file
      try {
     	 
         record = ( studrec ) input.readObject();

         // create array of Strings to display in GUI
         String values[] = { String.valueOf( record.getstudentid()),
            record.getstudentname(),String.valueOf( record.getGrade())};
         System.out.println(" Name =" + record.getstudentname());
         return values;

       
          }

      // display message when end-of-file reached
      catch ( EOFException endOfFileException ) {
        
             return null;
      }

      // display error message if class is not found
      catch ( ClassNotFoundException classNotFoundException ) {
         JOptionPane.showMessageDialog( this, "Unable to create object",
            "Class Not Found", JOptionPane.ERROR_MESSAGE );
            return null;
      }

      // display error message if cannot read due to problem with file
      catch ( IOException ioException ) {
         JOptionPane.showMessageDialog( this,
            "Error during read from file",
            "Read Error", JOptionPane.ERROR_MESSAGE );
            return null;
      }

   } // end method readRecord

/******************************************************************************/
   
   public boolean getStudCount()
   {
      studrec record;
      int studentcount=0;
      // input the values from the file
      
     try {
        while (true)
        {
          record = ( studrec ) input.readObject();
          System.out.println(" Name =" + record.getstudentname());
          return true;
         }
          
      }

      // display message when end-of-file reached
      catch ( EOFException endOfFileException ) {
        
            return false;
      }

      // display error message if class is not found
      catch ( ClassNotFoundException classNotFoundException ) {
         JOptionPane.showMessageDialog( this, "Unable to create object",
            "Class Not Found", JOptionPane.ERROR_MESSAGE );
           return false;
      }

      // display error message if cannot read due to problem with file
      catch ( IOException ioException ) {
         JOptionPane.showMessageDialog( this,
            "Error during read from file",
            "Read Error", JOptionPane.ERROR_MESSAGE );
           return false;
      }
   
    
   } // end method 
/******************************************************************************/
   // close file and terminate application
   private void closeFile()
   {
      // close file and exit
      try {
         input.close();
      //   System.exit( 0 );
      }

      // process exception while closing file
      catch ( IOException ioException ) {
         JOptionPane.showMessageDialog( this, "Error closing file",
            "Error", JOptionPane.ERROR_MESSAGE );

         System.exit( 1 );
      }

   } // end method closeFile
/******************************************************************************/   
   public static void main( String args[] )
   {
      new readstudentfile();
   }

} // end class
#15

هذا كلاس الريكورد

import java.io.Serializable;

public class studrec implements Serializable {
   private String studentname;
   private int studentid;
   private float grade;
   
   // no-argument constructor calls other constructor with default values
   public studrec() 
   {
      this(" ",0,0 );
   }
  
   // initialize a record
   public studrec( String name,int id,float g)
   { 
      studentname = name;
      studentid = id;
      grade = g;
   }
  
   public int getstudentid() 
   { 
      return studentid; 
   }

  
   public String getstudentname() 
   { 
      return studentname; 
   }
   
   public float getGrade()
   {
      return grade;
   }
   
   
} // end class

وهذا كلاس الانتر فيس

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class studenterUI extends JPanel {
   protected JLabel label[];
   protected JTextField field[]; 
   protected JButton nextButton,exitButton;
   private JPanel p1,p2;
   protected final static String names[] = { "Student Name ",
      "Student ID "};
   protected int size;
   public static final int NAME = 0, ID = 1;
   // set up GUI
   public studenterUI(int mysize)
   {
      //  super( "Informations" );
      size = mysize;
      p1 = new JPanel();
      p1.setBorder(new TitledBorder("Enter Student Informations : "));
      p1.setLayout(new GridLayout(size, 2));
      
      label = new JLabel[ size ];
      field = new JTextField[ size ];
      
      for ( int count = 0; count < label.length; count++ )
         label[ count ] = new JLabel( names[ count ] );
      
      for ( int count = 0; count < field.length; count++ )
         field[ count ] = new JTextField();
      
      for ( int count = 0; count < size; count++ ) 
      {
         p1.add( label[ count ] );
         p1.add( field[ count ] );
      }
      
      nextButton = new JButton();
      exitButton = new JButton(); 

      p2 = new JPanel();
      p2.setLayout(new GridLayout(1,2));
      p2.add(nextButton);
      p2.add(exitButton);
      
      setLayout( new BorderLayout() );
      add( p1, BorderLayout.CENTER );
      add( p2, BorderLayout.SOUTH );
      validate();
      
   } // end constructor
   
   public JButton getDoTask1Button() 
   { 
      return nextButton; 
   }
   
   public JButton getDoTask2Button() 
   { 
      return exitButton; 
   }
   
   public JTextField[] getFields() 
   { 
      return field; 
   }
   
   public void clearFields()
   {
      for ( int count = 0; count < size; count++ )
         field[ count ].setText( "" );
   }
   
   public void setFieldValues( String strings[] )
   {
      for ( int count = 0; count < size; count++ )
         field[ count ].setText( strings[ count ] );
   }
   
   public String[] getFieldValues()
   { 
      String values[] = new String[ size ];

      for ( int count = 0; count < size; count++ ) 
         values[ count ] = field[ count ].getText();

      return values;
   }


   /*public static void main( String args[] )
   { 
      studenterUI application = new studenterUI(2);
      application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
   }*/

} // end class studentID

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

تم تعديل هذه المشاركة بواسطة تالا في 6 مايو 2005 في 22:11

#16

هل من الممكن ان تضع الملفات التي يجب قراءتها

تم تعديل هذه المشاركة بواسطة khwlani في 7 مايو 2005 في 00:52

اللهم انا نسألك علما نافعا ونعوذ بك من حماقة الجهلاء
#17

السلام عليكم

عند القراءة من الملف يتم رمي الاستثناء EOFException عند الوصول إلى نهاية الملف ولا يرجع القيمة null بل يبقى المرجع يشير الى آخر كائن في الملف

لقد عقدت كثيرا عملية حساب عدد الكائنات في الملف يمكن اجراء العد في طريقة مخصصة لذلك ترجع عدد الكاءنات في الملف

 public int getNbOfStud()  {
     Student record=null;
     int nbSt = 0;
    try {
       while ((record = (Student) input.readObject()) != null) {
         System.out.println(record);
         nbSt++;
        }
        System.out.println(nbSt);
         
     //   return nbSt;
     }

     // display message when end-of-file reached
     catch ( EOFException eofe ) {

          System.out.println("Error: "+record);
          
        JOptionPane.showMessageDialog( this, 
       "End of file exception" + eofe,
           "EOFException", JOptionPane.ERROR_MESSAGE );
           eofe.printStackTrace();
          
      //     return nbSt;
     }

     // display error message if class is not found
     catch ( ClassNotFoundException cnfe ) {
        
          System.out.println("Error: "+record);
          
        
        JOptionPane.showMessageDialog( this, 
           "Unable to create object" + cnfe,
           "ClassNotFoundException", JOptionPane.ERROR_MESSAGE );
          cnfe.printStackTrace();
       //   return 0;
     }

     // display error message if cannot read due to problem with file
     catch (IOException ioe ) {

          System.out.println("Error: "+record);
          
        JOptionPane.showMessageDialog( this, 
           "Error during read from file" + ioe,
           "IOException", JOptionPane.ERROR_MESSAGE );
         ioe.printStackTrace();
      //   return 0;
     }
     catch (Exception e ) {

          System.out.println("Error: "+record);
          
        JOptionPane.showMessageDialog( this, 
           "Error during read from file" + e,
           "Exception", JOptionPane.ERROR_MESSAGE );
        e.printStackTrace();
      //  return 0;
     }
     finally {
        return nbSt;
     }
  
   
  } // end method

للأسف هذا لا يحل المشكلة حيث أن الاستثناء الصادر عند الوصول إلى نهاية الملف هو طبيعي أما الأمر الآخر هو بعد إجراء append فلا يستطيع قراءة البيانات التي تمت اضافتها إلى الملف وعند الوصول إليها يعطي الاستثناء StreamCorruptedException

لم استطع اكتشاف الخطأ حتى الان وهذا ما استطعت متابعته

#18

لماذا لا تضع لنا الخطأ كاملا!! الخطأ يوضح لك من أين خرج. ومن أي سطر وبعد أية مناداة الخ.

ضع لنا الملفات جميعها إن أمكن!!

#19

السلام عليكم

الاخ

kkhalil2005

اشكرك لايجاد طريقة افضل للعد .. واشكر متابعتك للموضوع وانا مازلت ابحث عن الحل

الاخ

ابو مازن

بالنسبة للخطأ فانه لايظهر هو فقط يعطي الاستثناء error during read file

ولا يكمل قراءة الريكورد اللتي اضيفت فقط يقرأ التي كتبت مع انشاء الملف لاول مرة

الاخ

khwlani

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

اشكر لكم تعاونكم .. جزاكم الله خير

#20
تالا كتب:
الاخ

khwlani

بالنسبة للملفات التي نقرأ منها بامكانك انشاءها بتنفيذ برنامج creatstudentfile]

اين هذا الكلاس

اللهم انا نسألك علما نافعا ونعوذ بك من حماقة الجهلاء
#21

السلام عليكم

الأخ أبو مازن ، الاستثناء الذي يرمى هو StreamCorruptedException يتم رميه عند الوصول إلى بداية الكائنات التي تمت اضافتها إلى الملف والجملة error during read file تتم طباعتها عند حصول الخطأ حيث وضعت من قبل المبرمج عند معالجة IOException

الاستثناء هو

java.io.StreamCorruptedException

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)

at ReadStudentFile.getNbStud(ReadStudentFile.java:146)

at ReadStudentFile.<init>(ReadStudentFile.java:34)

at ReadStudentFile.main(ReadStudentFile.java:204)

كما هو ظاهر فقد حصل داخل الطريقة getNbStudent التي تقوم بقراءة الكائنات من الملف لعدها وقد رمي هذا الاستثناء عند الوصول إلى بداية الكائنات التي تمت اضافتها إلى الملف

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

لم استطع ارفاق الملفات

سابعثها لك بemail

#22

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

لقد وجدت حل لمشكلة القراءة الخاطئة ..

تفسير المشكلة .. اضافة 4 بايت للاوبجكت فلذلك عند قرائته يجب ان نتخطى 4 بايت بواسطة الفنكشن :

ObjectInputStream.skip((long)4);

وهذه اللينك الموجود فيها من طرح المشكلة والحلول :

http://forum.java.sun.com/thread.jspa?four...threadID=279844

ولكن الى الان لم تعمل جيدا ربما وضعتها في مكان خاطئ ..

وبالنسبة للاكسبشن StreamCorruptedExeption فانه يظهر عندي ولم يحل بواسطة الفنكشن السابقة

تم تعديل هذه المشاركة بواسطة تالا في 8 مايو 2005 في 16:35

#23

السلام عليكم

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

هل هناك من جربها ؟

#24

السلام عليكم

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

يمكن حل المشكلة بأن ننقل (ننسخ) محتوى الملف الاصلي في ملف آخر جديد ومن ثم ادخال البيانات الجديدة وكتابتها بالملف الجديد مع لغي الملف الأول بعد الانتهاء منه. أو يمكن نقل البيانات إلى مصفوفة وثم فتح نفس الملف للأنشاء وكتابية البيانات التي بالمصفوفة في الملف واضافي البيانات الجديدة إليه. وهذا يرجع إلى حجم البيانات الموجودة بالملف إذا كانت كبيرة كثيرا فتعيق عمل البرنامج .

هذا حتى نجد حل للمشكلة الأولى التي اعتقد هي من عملية فتح الملف للأضافة.

#25

أنا جربتها: النتائج كما قد فهم البعض أن عليك تخطي أربع بيتات عند (الشيء) الذي سجل بعد فتح ملف!

تستطيع حل المسألة بعمل هذه الطريقة:

عند حفظ (شيء جديد) عليك 1-بفتح الملف ثم2- سجل الشيء بعد ذلك 3-أغلق الملف. وافعل هذا كلما أردت إضافة شيء جديد.

بعد هذا لو أردت القراءة، كل ماعليك هو فتح الملف، قراءة شيء، تخطي أربع بيتات، قراءة شيء ، تخطي أربع بيتات.

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

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