2009-10-12 7 views
0

Voici un extrait de code qui se comporte de manière étrange.Comportement étrange de l'objet RandomAccessFile

private void saveToFile() throws IOException { 
    JFileChooser fileChooser = new JFileChooser(); 
    File name = null; 

     int returnVal = fileChooser.showSaveDialog(fileChooser); 

    //Sets the variable name to the file the user selected. 
    if (returnVal == JFileChooser.APPROVE_OPTION) { 
      name = fileChooser.getSelectedFile(); 
     //Exits the method if the user selected cancel in the dialog box. 
    }else if (returnVal == JFileChooser.CANCEL_OPTION) { 
      return; 
     } 

    //Writes the text data to a file. 
    try { 
     //Writes the text in the textArea to the file which was selected. 
     RandomAccessFile raf = new RandomAccessFile(name, "rw"); 
     raf.writeBytes(textArea.getText()); 
     raf.close(); 
    //Display the stack trace and an error message if the file could not be written. 
    } catch (IOException e) { 
     e.printStackTrace(); 
     System.err.print(" Cannot process file....\n"); 
    } 

     //Displays the filename of which the file was saved to. 
    String fileName = name.getName(); 
     super.setTitle("XText: " + fileName); 

    //The text has now been saved and is no longer considered changed. 
    changed = false; 
} 

Le problème ce qui provoque le code est lorsque j'enregistre un fichier qui a été modifié, à lui-même et lorsque la taille est plus petite que quand il était quand il a été ouvert, le texte enregistré est pas le même que le texte montré. Je vais vous montrer tous les 3 exemples de texte.

Texte du fichier ouvert.

Il est temps que tous les hommes de bien viennent au secours de leur pays.
Il est temps que tous les hommes de bien viennent au secours de leur pays.
Il est temps que tous les hommes de bien viennent au secours de leur pays.
Le renard brun rapide a sauté par-dessus les chiens paresseux.
Le renard brun rapide a sauté par-dessus les chiens paresseux.
Le renard brun rapide a sauté par-dessus les chiens paresseux.

Modifié pour.

Il est temps que tous les hommes de bien viennent au secours de leur pays.
Il est temps que tous les hommes de bien viennent au secours de leur pays.
Le renard brun rapide a sauté par-dessus les chiens paresseux.
Le renard brun rapide a sauté par-dessus les chiens paresseux.

Texte dans le fichier enregistré. Ouvert dans un autre éditeur.

Il est temps que tous les hommes de bien viennent au secours de leur pays.
Il est temps que tous les hommes de bien viennent au secours de leur pays.
Le renard brun rapide a sauté par-dessus les chiens paresseux.
Le renard brun rapide a sauté par-dessus les chiens paresseux.

chiens paresseux retour.
Le renard brun rapide a sauté par-dessus les chiens paresseux.
Le renard brun rapide a sauté par-dessus les chiens paresseux.

Le texte enregistre correctement s'il est enregistré dans un nouveau fichier. Merci de votre aide.

Répondre

2

Pourquoi pensez-vous qu'il sera tronqué pour vous? Vous ouvrez le fichier existant (par exemple taille 1000) pour l'écriture, écrivez (par exemple) 800 octets là - la taille est toujours 1000, seulement 200 derniers contiennent maintenant la poubelle! Essayez file.setLength (0) juste après l'ouverture si vous voulez coller avec un fichier à accès aléatoire.

Sinon, je vous suggère de:

FileWriter fw = new FileWriter(name); 
fw.write(text); 
fw.close(); 
+0

Grand. C'était en quelque sorte la réponse que j'espérais obtenir. Mon instructeur avait trouvé la solution file.setLength (0) après avoir posté mon problème. Je me souviendrai d'utiliser file.setLength (0) si j'utilise l'objet RandomAccessFile dans le futur. Je me demande pourquoi l'API de cet objet ne dit rien de devoir faire cela, ou suis-je simplement aveugle d'un œil et ne peux pas voir de l'autre. Merci de votre aide. –

+0

Les commentaires d'API ne le disent pas, car ils supposent que vous utilisez RandomAccessFile pour une raison. Parce que normalement ce n'est pas le premier choix pour écrire un fichier. –