Записать конкретную строку в файл
Вопрос
Я пытаюсь записать строку в файл в положении строки 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()));
}
}
ИМХО, у вас есть три варианта:
- Выберите протокол, который будет работать с бинарными данными (например, для каждого объекта, запишите его длину (в байтах) в качестве целого числа (4 байта), за которым следует байты самого объекта;
- Кодируйте сериализованные байты в строку, используя, например, Base64, и используйте разделитель между объектами, который не является частью кодирования;
- Используйте objectOutputStream, чтобы сериализовать массив объектов. Написание новой записи будет состоять из десеризации массива, убедиться, что она имеет правильный размер или скопируйте ее в новый массив соответствующего размера, вставьте свой объект на его положение и отбрасывает весь массив.
- Проверка через файл, читающий текущие значения.
- Запишите каждое значение в новый временный файл.
- Если старый файл заканчивается до того, как ваш номер строки продолжает записывать пустые строки.
- Затем, как только вы дойдете до номера строки, вы хотите обновить новые данные.
- Если в старом файле больше строк, продолжайте писать.
- Удалить старый файл. Переименовать временный файл.