Technology fan Δημοσ. 27 Αυγούστου 2010 Δημοσ. 27 Αυγούστου 2010 Παραθέτω δύο τρόπους σε 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ο το μέγεθος είναι μειωμένο γιατί γίνεται αυτό? Να πω επίσης οτι και με τους δύο τρόπους, το αρχείο όταν το βλέπω μέσω προγράμματος δεν έχει κάποια διαφορά!
RubiksCube Δημοσ. 27 Αυγούστου 2010 Δημοσ. 27 Αυγούστου 2010 Ίσως λίγο offtopic: Μου κάνει εντύπωση πόσες γραμμές κώδικα χρειάζονται να κάνεις αντιγραφή ενός αρχείου στην java, όταν στο shell είναι μια γραμμή όλο και όλο! cat file1>file2 Όσο για την ερώτηση, σν δοκιμάσεις να πάρεις το μικρότερο αρχείο και ξανακάνεις την ίδια διαδικασία μικραίνει και άλλο?
Technology fan Δημοσ. 27 Αυγούστου 2010 Μέλος Δημοσ. 27 Αυγούστου 2010 Όχι δεν μικραίνει κι άλλο, Βασικά καταλάθος που έπαιζα με μία άλλη λειτουργία(Στην οποία υπάρχει η εντολή System.gc), μετά την οποία έφτιαχναν ίδιου μεγέθους αρχεία, λέτε να φταίει αυτό?
javavall Δημοσ. 27 Αυγούστου 2010 Δημοσ. 27 Αυγούστου 2010 Ίσως λίγο offtopic: Μου κάνει εντύπωση πόσες γραμμές κώδικα χρειάζονται να κάνεις αντιγραφή ενός αρχείου στην java, όταν στο shell είναι μια γραμμή όλο και όλο!cat file1>file2 Όσο για την ερώτηση, σν δοκιμάσεις να πάρεις το μικρότερο αρχείο και ξανακάνεις την ίδια διαδικασία μικραίνει και άλλο? Που να δεις ποσες γραμμές κώδικα χρειάζονται για να φτιάξεις παράθυρο στο shell. Μα τι συγκρίνεις τώρα...
Technology fan Δημοσ. 27 Αυγούστου 2010 Μέλος Δημοσ. 27 Αυγούστου 2010 Ίσως λοιπόν το λάθος να βρίσκεται κατα την εγγραφή.. >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 } λέτε να μαζεύει και να γράφει σκουπίδια κατα την εγγραφή?
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.