Вопрос

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

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

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

Этот ответ В значительной степени суммирует то, что я хочу - но с написанием, кажется, это ведет себя иначе.

редактировать: Я разъяснил свой вопрос из -за комментариев

Это было полезно?

Решение

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

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

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

Другие советы

Это не сработает, потому что каждый сериализованный объект может содержать один или несколько новых символов (ы) как часть его двоичного представления. Так что, если вы напишете новый объект в строке 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. Выберите протокол, который будет работать с бинарными данными (например, для каждого объекта, запишите его длину (в байтах) в качестве целого числа (4 байта), за которым следует байты самого объекта;
  2. Кодируйте сериализованные байты в строку, используя, например, Base64, и используйте разделитель между объектами, который не является частью кодирования;
  3. Используйте objectOutputStream, чтобы сериализовать массив объектов. Написание новой записи будет состоять из десеризации массива, убедиться, что она имеет правильный размер или скопируйте ее в новый массив соответствующего размера, вставьте свой объект на его положение и отбрасывает весь массив.
  • Проверка через файл, читающий текущие значения.
  • Запишите каждое значение в новый временный файл.
  • Если старый файл заканчивается до того, как ваш номер строки продолжает записывать пустые строки.
  • Затем, как только вы дойдете до номера строки, вы хотите обновить новые данные.
  • Если в старом файле больше строк, продолжайте писать.
  • Удалить старый файл. Переименовать временный файл.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top