Почему ObjectOutputStream записывает символы в файл вместо моего ввода?

Я пытаюсь записать свой ArrayList с именем Clients в файл. Он работает, но, к сожалению, он просто записывает символы в файл, а не мой фактический ввод.

Ниже мой код:

    public void SaveToFile() {

    try 
    {
        FileOutputStream fos = new FileOutputStream("CustomerLists.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(Clients);
        oos.close();
    } catch (Exception ex) {
        ex.printStackTrace();
   }

Как заставить его работать?


person Jade    schedule 26.11.2016    source источник
comment
Вы понимаете, что делает writeObject?   -  person Makoto    schedule 26.11.2016
comment
Он печатается в двоичном формате. Он не предназначен для чтения человеком.   -  person 4castle    schedule 26.11.2016
comment
Или, что еще важнее, понимаете ли вы, что _1 _ делает? Он создает двоичный поток сериализованных объектов и значений Java. Если вам нужен текст, создайте FileWriter вместо FileOutputStream и при необходимости оберните его в PrintWriter и / или _5 _.   -  person Andreas    schedule 26.11.2016
comment
comment
Суть этого вопроса в том, для чего ObjectOutputStream; ни один из этих возможных дубликатов не решает эту проблему.   -  person dimo414    schedule 26.11.2016
comment
@ dimo414 Суть этого вопроса в том, что OP ожидает создания текстового файла, и оба дубликата адресуют это точно.   -  person user207421    schedule 26.11.2016
comment
@EJP ну, цель - написать текстовый файл, но путаница проистекает из неправильного понимания цели ObjectOutputStream. В любом случае, у OP есть то, что им нужно.   -  person dimo414    schedule 26.11.2016
comment
@ dimo414 спасибо за понимание, второй вопрос вообще не касается того, что я ищу,   -  person Jade    schedule 26.11.2016
comment
@EJP Здесь я имею дело с ArrayList, я знаю, как писать в txt файл, но моя борьба заключается в том, чтобы писать ArrayList в текстовый файл   -  person Jade    schedule 26.11.2016
comment
@Andreas Я изменил его так, как вы мне сказали, используя Filewriter и BufferedReader, но моя проблема в том, что вы видите, где я написал oos.writeobject (Clients) - Clients - это мой массив, и когда я меняю его на oos.write, это не позволит мне, потому что это является Arraylist, что может быть альтернативой для этого?   -  person Jade    schedule 26.11.2016


Ответы (2)


Вы сделали сериализацию объекта Java в файл с ObjectOutputStream. Это означает, что Java преобразует ваш объект Clients в конкретное представление, которое охватывает все состояние вашего объекта, например переменные-члены. Это представление не предназначено для чтения человеком, это двоичный формат, который более эффективен и подходит для классов и среды Java, чем текстовый формат. Дополнительную информацию см. здесь.

Вместо этого вы можете использовать _3 _, BufferedWriter или _ 5_, которые имеют несколько write[...](...) методов для записи текста в файл. В этом случае вы должны записать каждую переменную как String и т. Д., А не весь класс. Здесь вы можете найти соответствующий пример.

Другой вариант сделать то же самое, что и ObjectOutputStream для всего объекта, но в полностью настраиваемой и удобочитаемой форме, - использовать Архитектура Java для привязки XML (JAXB), но для этого нужно немного прочитать. Существуют также другие библиотеки сериализации объектов для JSON и других форматов.

person thatguy    schedule 26.11.2016

Почему, когда я запускаю эту Java-программу, она создает текстовый файл, но печатает символы вместо моего ввода?

Потому что это не текстовый файл. Это сериализованные данные, записанные в соответствии с протоколом сериализации Java, поскольку вы используете ObjectOutputStream.writeObject().

Это также означает, что CustomerLists.txt не подходящее имя для этого файла.

Если вам нужен текст, используйте PrintWriter или BufferedWriter.

person user207421    schedule 26.11.2016