Question

Je suis en train de ligne d'écriture dans un fichier au n-position de la ligne.

Même si la ligne n est pas présent. Dans ce cas, le fichier doit se développer avec des lignes vides pour atteindre n. Fondamentalement, quelque chose comme writer.writeLine(n, mycontent). myCONTENT est une représentation binaire de ObjectOutputStream. Chaque ligne du fichier contient un objet sérialisé. La ligne numéro est l'indice.

Comment puis-je écrire sur une ligne spécifique? -. Sans utiliser FileUtils ou des composants de l'API non standard

Cette réponse sommes à peu près jusqu'à ce que je veux - mais avec l'écriture, il semble se comporter différents.

modifier Je lui ai clarifié ma question en raison des commentaires

Était-ce utile?

La solution

La notion de ligne est très important pour vous? Sinon, vous pourriez probablement sérialiser une carte dans un fichier, et l'utiliser pour écrire ou lire vos objets à un index spécifique (dans ce cas, l'indice serait la clé de la carte).

Voici un petit exemple.

    public static void main(String[] args) throws Exception {
    ObjectOutputStream tocStream = new ObjectOutputStream(new FileOutputStream("myfile.toc"));
    Map<Integer,Object> tableOfContent = new HashMap<Integer, Object>();
    String myString = "dataOne";
    Date myDate = new Date();
    tableOfContent.put(0,myDate);
    tableOfContent.put(1,myString);
    tocStream.writeObject(tableOfContent);
    tocStream.flush();
    tocStream.close();
    ObjectInputStream tocInputStream = new ObjectInputStream(new FileInputStream("myfile.toc"));
    Map<Integer,Object> restoredTableOfContent = (Map<Integer, Object>) tocInputStream.readObject();
    Object restoredMyString  =  restoredTableOfContent.get(1);
    System.out.println(restoredMyString);
    tocInputStream.close();
}

Autres conseils

Cela ne fonctionnera pas, parce que chaque objet sérialisé peut contenir un ou plusieurs caractères de nouvelle ligne (s) dans le cadre de la sa représentation binaire. Donc, si vous écrivez un nouvel objet à la ligne 3, vous pourriez très bien écrire l'objet au milieu de la représentation binaire de votre premier. Testez-le:

public class OOSTest {
    public static void main(String[] args) throws IOException {
        String s = "Hello\nWorld";
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(s);
        oos.flush();
        oos.close();
        System.out.println(new String(bos.toByteArray()));
    }
}

à mon humble avis, vous avez trois choix:

  1. Choisir un protocole qui fonctionne avec des données binaires (par exemple, pour chaque objet, écrire la longueur (en octets) sous la forme d'un nombre entier (4 octets), suivi des octets de l'objet lui-même;
  2. Coder les bytes sérialisé dans une chaîne, en utilisant base64 par exemple, et utiliser un séparateur entre les objets qui ne font pas partie du codage;
  3. Utilisez un ObjectOutputStream sérialiser un tableau d'objets. Rédaction d'une nouvelle entrée consisterait à désérialisation le tableau, assurez-vous qu'il a la bonne taille ou le copier dans un nouveau tableau de la taille appropriée, insérez votre objet à sa position, et resérialisation tout le tableau.
  • Boucle dans le fichier lecture du les valeurs actuelles.
  • Ecrire chaque valeur sur à un nouveau fichier temporaire.
  • Si l'ancien fichier se termine avant votre numéro de ligne donjon écrivant des lignes vides.
  • Puis, une fois vous obtenez au numéro de ligne que vous voulez Ecrivez les nouvelles données.
  • S'il y a plus de lignes à l'ancienne l'écriture du fichier de donjon.
  • Supprimer l'ancien fichier. Renommez le fichier temporaire.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top