Προς το περιεχόμενο

Σχετικά με αντιγραφή αρχείου σε java


Technology fan

Προτεινόμενες αναρτήσεις

Δημοσ.

Παραθέτω δύο τρόπους σε java οι οποίοι αντιγράφουν ένα αρχείο σε κάποιο άλλο. Να επισημάνω οτι το αρχείο αυτό είναι εγγραφής αντικειμένων (.ser)

 

1ος τρόπος

>
                       InputStream in=null;
                       OutputStream out= null;
                       try{
                       in = new FileInputStream(new File("Unsaved.ser"));
                       out = new FileOutputStream(new File(selectedFile.getAbsolutePath()));
                       // Transfer bytes from in to out
                       [color="Red"][b]byte[] buf = new byte[1024];
                       int len;
                       while ((len = in.read(buf)) > 0){
                       out.write(buf, 0, len);
                       }[/b][/color]

                       }catch (FileNotFoundException ex) {
                       //ex.printStackTrace();
                       }catch (IOException ex) {
                       //ex.printStackTrace();
                       }
                       if (in!=null)
                       try {
                       in.close();
                       out.close();
                       JOptionPane.showMessageDialog(null, "Το αρχείο σώθηκε επιτυχώς","Επιτυχία",JOptionPane.PLAIN_MESSAGE);

                       } catch (IOException ex) {
                       Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                       }

 

 

2ος τρόπος

>                        ObjectInputStream inputStream=null;
                       ObjectOutputStream out=null;
                       try {

                           //Construct the ObjectInputStream object
                           inputStream = new ObjectInputStream(new FileInputStream("Unsaved.ser"));
                           //out = new FileOutputStream(new File(selectedFile.getAbsolutePath()));
                           out = new ObjectOutputStream(new FileOutputStream(new File(selectedFile.getAbsolutePath())));

                           Object obj = null;
                           System.out.println("Diabasma: ");
                           int i=0;
                          [color="Red"][b] while ((obj = inputStream.readObject()) != null) {
                               out.writeObject(obj);
                           }[/b][/color]


                       } catch (EOFException ex) { //This exception will be caught when EOF is reached
                           System.out.println("End of file reached.");
                       } catch (ClassNotFoundException ex) {
                           //ex.printStackTrace();
                       } catch (FileNotFoundException ex) {
                           //ex.printStackTrace();
                       } catch (IOException ex) {
                           //ex.printStackTrace();
                       } finally {
                           //Close the ObjectInputStream
                           try {
                               if (inputStream != null) {
                                   inputStream.close();
                               }
                           } catch (IOException ex) {
                               //ex.printStackTrace();
                           }
                       }

 

Το ερώτημα μου είναι οτι όταν χρησιμοποιώ τον 1ο τρόπο το αρχείο που δημιουργείται εχει την ίδιο μέγεθος (bytes εννοώ) ενώ με τον 2ο το μέγεθος είναι μειωμένο γιατί γίνεται αυτό? Να πω επίσης οτι και με τους δύο τρόπους, το αρχείο όταν το βλέπω μέσω προγράμματος δεν έχει κάποια διαφορά!

Δημοσ.

Ίσως λίγο offtopic: Μου κάνει εντύπωση πόσες γραμμές κώδικα χρειάζονται να κάνεις αντιγραφή ενός αρχείου στην java, όταν στο shell είναι μια γραμμή όλο και όλο!

cat file1>file2

 

Όσο για την ερώτηση, σν δοκιμάσεις να πάρεις το μικρότερο αρχείο και ξανακάνεις την ίδια διαδικασία μικραίνει και άλλο?

Δημοσ.

Όχι δεν μικραίνει κι άλλο,

Βασικά καταλάθος που έπαιζα με μία άλλη λειτουργία(Στην οποία υπάρχει η εντολή System.gc), μετά την οποία έφτιαχναν ίδιου μεγέθους αρχεία, λέτε να φταίει αυτό?

Δημοσ.
Ίσως λίγο offtopic: Μου κάνει εντύπωση πόσες γραμμές κώδικα χρειάζονται να κάνεις αντιγραφή ενός αρχείου στην java, όταν στο shell είναι μια γραμμή όλο και όλο!

cat file1>file2

 

Όσο για την ερώτηση, σν δοκιμάσεις να πάρεις το μικρότερο αρχείο και ξανακάνεις την ίδια διαδικασία μικραίνει και άλλο?

 

Που να δεις ποσες γραμμές κώδικα χρειάζονται για να φτιάξεις παράθυρο στο shell. :P

Μα τι συγκρίνεις τώρα...

Δημοσ.

Ίσως λοιπόν το λάθος να βρίσκεται κατα την εγγραφή..

 

>public boolean InsertObject(Object obj){
       AppendableObjectOutputStream outputStream = null;
       boolean success=false;
               ObjectOutputStream output=null;

               try {
                  [b][color="Red"] if (new File("Unsaved.ser").exists()){
                       outputStream = new AppendableObjectOutputStream(new FileOutputStream("Unsaved.ser",true));
                       outputStream.writeObject(obj);
                   }
                   else{
                       output = new ObjectOutputStream(new FileOutputStream("Unsaved.ser"));
                       output.writeObject(obj);[/color][/b]
                   }

               } catch (FileNotFoundException ex) {
                    //ex.printStackTrace();
               } catch (IOException ex) {
               //ex.printStackTrace();
               } finally {
                   //Close the ObjectOutputStream
                   try {
                       if (outputStream != null) {
                       outputStream.flush();
                       outputStream.close();
                       }
                       if (output != null) {
                       output.flush();
                       output.close();
                       }
                       success= true;
                   } catch (IOException ex) {
                   //ex.printStackTrace();
                   }
               }
               return success;
           }

 

οπου AppendableObjectOutputStream:

>public class AppendableObjectOutputStream extends ObjectOutputStream {

 public AppendableObjectOutputStream(OutputStream out) throws IOException {
   super(out);
 }

 @Override
 protected void writeStreamHeader() throws IOException {
   // do not write a header
 }

 

λέτε να μαζεύει και να γράφει σκουπίδια κατα την εγγραφή?

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...