public class Solution implements Serializable, AutoCloseable {
public String line = "a;dfa;f;kajf;kaf;ajf;ajf;ajf;";
public String fileName;
transient private FileOutputStream stream;
public Solution(String fileName) throws FileNotFoundException {
this.fileName = fileName;
this.stream = new FileOutputStream(fileName);
}
public void writeObject(String string) throws IOException {
stream.write(string.getBytes());
stream.write("\n".getBytes());
stream.flush();
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(line);
out.writeObject(fileName);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
line =(String) in.readObject();
stream = new FileOutputStream(fileName, true);
}
@Override
public void close() throws Exception {
System.out.println("Closing everything!");
stream.close();
}
public static void main(String[] args) throws Exception {
Solution sol = new Solution("c:/1.txt");
sol.writeObject(sol.line);
sol.close();
FileOutputStream fileOutputStream = new FileOutputStream("c:/2.bin");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(sol);
FileInputStream fileInputStream = new FileInputStream("c:/2.bin");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Solution solution = (Solution)objectInputStream.readObject();
Не могу понять присутствие
stream.write("\n".getBytes());
- как я понимаю он должен переносить строку, а append = true дает мне добавление в конец файла. Как я понимаю после десеарилизации у меня в файле должно быть 2 строки
String line = "a;dfa;f;kajf;kaf;ajf;ajf;ajf;";
а у меня судя по всему перезаписывает т.к. строка одна - это первое.
Второе - правильно ли я понял, эта задача похожа на ту, с нитью, где нам нужно продолжить работу нити при десериализации файла? Т. к. Консруктор при десериализации не запускается, тем самым не открывает поток записи в файл строки, то мы в методе readObject запускаем его в ручную строкой
stream = new FileOutputStream(fileName, true);
верно?