2016-11-26 5 views
0

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

Ниже мой код:

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

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

+4

Вы понимаете, что делает 'writeObject'? – Makoto

+1

Он печатает в двоичном формате. Он не предназначен для чтения человеком. – 4castle

+1

Или, что еще более важно, вы понимаете, что делает ['ObjectOutputStream'] (https://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html)? Он создает ** двоичный ** поток сериализованных объектов и значений Java. Это вы хотите текст, создайте ['FileWriter'] (https://docs.oracle.com/javase/8/docs/api/java/io/FileWriter.html) вместо' FileOutputStream' и, возможно, оберните это в ['PrintWriter'] (https://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html) и/или [' BufferedWriter'] (https: // docs. oracle.com/javase/8/docs/api/java/io/BufferedWriter.html). – Andreas

ответ

2

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

Что вы можете сделать вместо этого использовать FileWriter, BufferedWriter или PrintWriter, которые имеют несколько write[...](...) методы ввода текста в файл. В этом случае вы должны написать каждую переменную для себя как String и т. Д., А не весь класс. Here вы можете найти пример.

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

1

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

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

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

Если вы хотите использовать текст, используйте PrintWriter или BufferedWriter.

Смежные вопросы