Domanda

Sto cercando di linea di scrittura in un file alla linea-posizione n.

Anche se la linea n non è presente. In questo caso il file deve crescere con righe vuote per raggiungere n. Fondamentalmente qualcosa come writer.writeLine(n, mycontent). MyContent è una rappresentazione binaria da ObjectOutputStream. Ogni riga del file contiene un oggetto serializzato. La line-numero è l'indice.

Come posso scrivere su una linea specifica? -. Senza usare fileutils o qualsiasi componente API non standard

questa risposta praticamente riassume up quello che voglio - ma con la scrittura sembra comportarsi diverso.

modifica ho chiarito la mia domanda a causa dei commenti

È stato utile?

Soluzione

E 'il concetto di linea è molto importante per te? In caso contrario, si potrebbe forse serializzare una mappa in un file, e utilizzarlo per scrivere o leggere i vostri oggetti ad un indice specifico (in questo caso, l'indice sarebbe fondamentale della mappa).

Ecco un piccolo esempio.

    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();
}

Altri suggerimenti

questo non funzionerà, perché ogni oggetto serializzato potrebbe contenere uno o più caratteri di nuova riga (s) come parte della sua rappresentazione binaria. Quindi, se si scrive un nuovo oggetto alla linea 3, si potrebbe benissimo scrivere l'oggetto al centro della rappresentazione binaria del primo. Provatelo:

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()));
    }
}

IMHO, sono disponibili tre opzioni:

  1. Scegliere un protocollo che funziona con dati binari (ad esempio: per ogni oggetto, scrivere la sua lunghezza (in byte) come un intero (4 byte) seguito con i byte dell'oggetto stesso;
  2. Codificare i byte serializzati in una stringa, utilizzando Base64 per esempio, e utilizzare un separatore tra gli oggetti che non fa parte della codifica;
  3. Usa un ObjectOutputStream serializzare un array di oggetti. Scrivi nuova voce consisterebbe nel deserializzazione matrice, assicurarsi che ha la dimensione giusta o copiarlo in un nuovo array di dimensioni adeguate, inserto l'oggetto nella sua posizione, e serializzare nuovamente l'intero array.
  • Loop attraverso il file lettura del valori correnti.
  • Scrivi ogni valore fuori a un nuovo file temporaneo.
  • Se il vecchio file estremità prima della linea numero mastio scrivere le righe vuote.
  • Poi, una volta si arriva al numero della linea che si desidera per aggiornare Scrivi i nuovi dati.
  • Se non v'è più linee al vecchio scrittura mastio file.
  • Elimina il vecchio file. Rinominare il file temporaneo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top