Комо anexar objectos подставляет грех ObjectOutputStream borrar contenido fichero?

La cuestion es ЕКА, нет я anexa Лос objetos creados los que contiene ya el fichero, китайский que я Лос sobreescribe... alguien sabe Комо solucionarlo? Os dejo el codigo que hace la funcion de guardar los objetos.

public static void EscriureFitxer(String nom,String cognom1,String cognom2,String dni,File FILE_NAME,ArrayList<Alumne> list){
                Alumne a = new Alumne (nom,cognom1,cognom2,dni);
                list.add(a);
                ObjectOutputStream objectOutput = null;
                try {
                    objectOutput = new ObjectOutputStream(new FileOutputStream(FILE_NAME));
                    objectOutput.writeObject(list);

                    System.out.println("S'ha generat el fitxer " + FILE_NAME);

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if(objectOutput != null) {
                        try {
                objectOutput.close();
                        } catch (IOException ignored) {
                        }
                    }
                }
}


public static void LlegirFitxer(File FILE_NAME){
        ObjectInputStream objectInput = null;

                try {
                    objectInput = new ObjectInputStream(new FileInputStream(FILE_NAME));

                    ArrayList<Alumne> list = (ArrayList<Alumne>) objectInput.readObject();
                    for(int u=0;u<list.size();++u) {
                        System.out.println(u + " --> " + list.get(u));
                    }

                    objectInput.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } finally {
                if(objectInput != null) {
            try {
                        objectInput.close();
            } catch (IOException ignored) {
            }
                }
                }       
}
2
задан 24.01.2017, 19:26
0 ответов

Класс FileOutputStream предлагает строитель с двумя параметрами: FileOutputStream(File file, boolean append) где второй аргумент boolean append покажи, хочешь ли ты re написать файл или продолжить написание с конца. Добавь параметр в true в твоем коде:

objectOutput = new ObjectOutputStream(new FileOutputStream(FILE_NAME, true));

Adicionalmente, если ты работаешь с Java 7, ты можешь использовать try-with-resources и избегать звонить в метод close вручную:

//el bloque try va a cerrar el stream por ti
try (ObjectOutputStream objectOutput = new ObjectOutputStream(
         new FileOutputStream(FILE_NAME, true))) {
    objectOutput.writeObject(list);
    System.out.println("S'ha generat el fitxer " + FILE_NAME);
    //adicionalmente, el bloque catch puede contener más de un tipo de excepción separadas por pipe 
} catch (FileNotFoundException | IOException e) {
    e.printStackTrace();
}
1
ответ дан 03.12.2019, 17:31
  • 1
    Это уже я это протестировал luiggi и serializacion в java не выносит boolean true, и следовательно создав новый объект и вводить это в файл, удаляет контент файла и помещает последний созданный объект, в canvio с параметром true, что он делает, состоит в том, чтобы игнорировать последний созданный объект и он покажет тебе в файле первый объект, который ты создал заблаговременно. –  24.01.2017, 15:38

Это происходит, потому что метод writeObject он не уважает того, что есть ранее письменный в файле. Ты можешь создавать метод, чтобы читать файл перед sobreescribirlo:

public String leeArchivo (String ruta) {

    File file = new File(ruta);
    FileInputStream fis = null;
    String contenido="";

    try {
        fis = new FileInputStream(file);

        int content;
        while ((content = fis.read()) != -1) {
            // Convertir a char para guardarlo
            contenido += Character.toString((char) content));
        }
        return contenido;

    } catch (IOException e) {
        e.printStackTrace();
        return null;
    } finally {
        try {
            if (fis != null)
                fis.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

И в твоем методе, который он пишет в файле, он пишет результат чтения файла, перед тем, как писать новое.

String contenido = leeArchivo(FILE_NAME);
objectOutput = new ObjectOutputStream(new FileOutputStream(FILE_NAME));
objectOutput.writeBytes(contenido);
objectOutput.writeObject(list);
0
ответ дан 03.12.2019, 17:31
  • 1
    Привет cnbandicoot я осуществлял пример, который ты поместил как ответ, но говорить тебе, что он дает мне проблемы, когда я ввожу объект внутри файла, нет проблемы но во время хотеть прочитать это он дает мне ошибку и я думаю, что он, потому что ты работал с String, и я использую arraylist, чтобы хранить более одного объекта и это записывать в файле, у тебя есть идея, как было бы возможно изменять пример, который ты переместил меня, чтобы работать с arraylist, и не последуйте за этой ошибкой? спасибо –  24.01.2017, 15:34
  • 2
    Посмотри посмотрим с actualizació n, что añ adido в có я говорю, что он подает тебя. Я существую añ adido lí nea: objectOutput.writeBytes(contenido); и линия: objectOutput.writeObject(list); –  24.01.2017, 17:18
  • 3
    at java.io. ObjectInputStream.readObject0 (ObjectInputStream.java‌​:1365) at java.io. ObjectInputStream.readObject (ObjectInputStream.java:‌†‹373) at cat.iesjoaquimmir.alumnesapp.views.console. Application. Llegi‌​ rFitxer (Application. ‌†‹java:231) at cat.iesjoaquimmir.alumnesapp.views.console. Application.main (‌†‹Application.java:192‌​) Восток - ошибка, которая выходит у меня сейчас, я существую añ adido метод llegirFitxer (); для aver, если нужно изменять что-то еще –  24.01.2017, 19:26

Теги

Похожие вопросы