Pregunta

Estoy intentando línea de escritura en un archivo en línea de la posición n.

Aunque la línea n no está presente. En ese caso, el archivo tiene que crecer con líneas vacías para llegar n. Básicamente algo así como writer.writeLine(n, mycontent). Mi contenido es una representación binaria de ObjectOutputStream. Cada línea del archivo contiene un objeto serializado. El-número de línea es el índice.

¿Cómo puedo escribir en una línea específica? -. Sin utilizar FileUtils o cualquiera de los componentes de la API no estándar

esta respuesta resume bastante lo que yo quiero - pero con la escritura que parece comportarse diferente.

editar Le aclaré mi pregunta debido a los comentarios

¿Fue útil?

Solución

¿Es la noción de línea es muy importante para usted? De lo contrario, probablemente podría serializar un mapa en un archivo, y lo utilizan para escribir o leer los objetos a un índice específico (en este caso, el índice sería la clave del mapa).

Aquí hay un pequeño ejemplo.

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

Otros consejos

Esto no funcionará, ya que cada objeto serializado puede contener uno o varios caracteres de nueva línea (s) como parte de la su representación binaria. Así que si se escribe un nuevo objeto en la línea 3, que muy bien puede ser que escriba el objeto en el medio de la representación binaria de la primera. Prueba de que:

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

En mi humilde opinión, usted tiene tres opciones:

  1. Elija un protocolo que va a trabajar con datos binarios (por ejemplo: para cada objeto, escribir su longitud (en bytes) como un entero (4 bytes) seguido con los bytes del objeto en sí;
  2. codificar los bytes serializados en una cadena, utilizando Base64 por ejemplo, y utilizar un separador entre los objetos que no forma parte de la codificación;
  3. Usar un ObjectOutputStream serializar un conjunto de objetos. Escribir una nueva entrada consistiría en deserializar la matriz, asegúrese de que tiene el tamaño adecuado o copiarlo a una nueva matriz del tamaño apropiado, insertar el objeto en su posición, y reserializar todo el conjunto.
  • Bucle a través del archivo de la lectura de la valores actuales.
  • Escribir a cabo cada valor a un nuevo archivo temporal.
  • Si el archivo antiguo termina antes de su número de línea mantienen escribiendo líneas en blanco.
  • A continuación, una vez se obtiene con el número de línea que desea para actualizar escribe los nuevos datos.
  • Si hay más líneas a la antigua torreón de escritura de archivos.
  • Eliminar el viejo expediente. Cambie el nombre del archivo temporal.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top