Запишите конкретную строку в файл - PullRequest
2 голосов
/ 15 января 2011

Я пытаюсь записать строку в файл в позиции строки n.

Даже если строка n отсутствует.В этом случае файл должен расти с пустыми строками, чтобы достичь n.В основном что-то вроде writer.writeLine(n, mycontent).mycontent - это двоичное представление из ObjectOutputStream.Каждая строка файла содержит сериализованный объект.Номер строки - это индекс.

Как мне написать в определенную строку?- Без использования FileUtils или каких-либо нестандартных API-компонентов.

Этот ответ в значительной степени подводит итог того, что я хочу, но при написании он выглядит по-другому.

edit: Я уточнил свой вопрос из-за комментариев

Ответы [ 3 ]

2 голосов
/ 15 января 2011

Это не будет работать, потому что каждый сериализованный объект может содержать один или несколько символов новой строки как часть своего двоичного представления.Поэтому, если вы напишите новый объект в строке 3, вы вполне можете написать объект в середине двоичного представления вашего первого объекта.Проверьте это:

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

ИМХО, у вас есть три варианта:

  1. Выберите протокол, который будет работать с двоичными данными (например: для каждого объекта укажите его длину (вbytes) как целое число (4 байта), за которым следуют байты самого объекта;
  2. Кодируют сериализованные байты в строку, используя, например, Base64, и используют разделитель между объектами, который не является частью
  3. Используйте ObjectOutputStream для сериализации массива объектов. Написание новой записи будет состоять в десериализации массива, убедитесь, что он имеет правильный размер, или скопируйте его в новый массив соответствующего размера, вставьтеобъект на его месте, и повторно выполнить весь массив.
2 голосов
/ 15 января 2011

Является ли понятие линии очень важным для вас? В противном случае вы могли бы, вероятно, сериализовать карту в файле и использовать ее для записи или чтения ваших объектов по определенному индексу (в этом случае индекс будет ключом карты).

Вот небольшой пример.

    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();
}
0 голосов
/ 15 января 2011
  • Перебрать файл, читая текущие значения.
  • Запишите каждое значение в новый временный файл.
  • Если старый файл заканчивается до сохранения номера строки выписывать пустые строки.
  • Тогда один раз Вы попадаете на номер строки, которую хотите обновить выпиши новые данные.
  • Если есть еще строки к старому файл продолжайте писать.
  • Удалить старое файл. Переименуйте временный файл.
...