Когда использовать flush () в java?

import java.io. * ;
public class Ser {

    public static void main(String args[]) {

        try {
            John myObj = new John("Sachin", "Cricket");
            System.out.println(myObj);
            FileOutputStream fos = new FileOutputStream("FileName");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(myObj);
            oos.flush();
            oos.close();
        } catch (Exception e) {
            System.out.println("Expection" + e);
            System.exit(0);
        }

        try {
            John myObj2;
            FileInputStream fis = new FileInputStream("FileName");
            ObjectInputStream ois = new ObjectInputStream(fis);
            myObj2 = (John) ois.readObject();
            ois.close();
            System.out.println("New Object" + myObj2);
        } catch (Exception e) {
            System.out.println("Expection" + e);
            System.exit(0);
        }

    }
}

class John implements Serializable {

    private String name;
    private String department;

    public John(String name, String department) {
        this.name = name;
        this.department = department;
    }

    public String toString() {
        return "Name" + name + " " + "Department" + department;

    }

}

у меня есть несколько вопросов в приведенном выше примере.

  1. когда использовать метод flush и почему мы ее используем?
  2. что делает метод close нести счет здесь?
  3. myObj2 = (John) ois.readObject(); ... пожалуйста, исправьте меня, если я ошибаюсь, Я читаю объект file и сохраняю в другой объект и типизирую объект file.
  4. каковы альтернативы сериализации или сохранения данных в Java. Я не хочу, чтобы данные в файл байт поток.

6 ответов


когда использовать метод flush и почему мы ее используем?

он смывает все, что еще буферизовано OutputStream. Подробное описание доступно в JavaDoc.


что делает метод close нести счет здесь?

Я не уверен, что вы подразумеваете под 'нести результат, но close метод окончательно закрывает ресурсы (входной сигнал или выход), он выпускает например ручки файла. Ты всегда должен звонить. закрыть в finally блок для очистки всех ссылок, которые может иметь ОС.

InputStream is = null;
try {
    is = new FileInputStream(...);
    // do stuff
} catch (IOException e) {
    // do stuff
} finally {
    if (is != null) {
        is.close();
    }
}

myObj2 = (John) ois.readObject (); ... пожалуйста, поправьте меня, если я ошибаюсь, я читаю объект file и сохраняю в другой объект и типизация объекта file.

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


каковы альтернативы сериализации или сохранения данных в Ява. Я не хочу, чтобы данные в файл как поток байтов.

у вас есть несколько вариантов. Для клиентского приложения вы можете использовать XML, JSON или облегченную базу данных, такую как SQLlite. На стороне сервера вы также можете взглянуть на более надежные базы данных (например, MySQL).


  1. когда использовать метод flush и почему мы ее используем?

это используется, когда должна быть синхронная отправка

например, у вас есть дуплексное (двухстороннее) соединение, и вы только что отправили сообщение, и теперь вам нужно дождаться ответа на него, без промывки буферизованный outputstream может удерживать его, пока буфер не заполнится (тупик)

  1. myObj2 = (John) ois.readObject(); пожалуйста, поправьте меня, если я ошибаюсь, Я читаю файл объект и хранение в другой объект и типизация объекта file.

неправильно! Вы читаете некоторые данные из потока typecast его в Джон (который будет бросать, если объект read не был Джоном)

  1. каковы альтернативы сериализации или сохранения данных в Java. Я не хочу, чтобы данные в файл как поток байтов.

вы можете написать его как текст (напишите поля как текст на строке) и предоставить метод для разбора его на объект


есть несколько вопросов в приведенном выше примере.

  1. когда использовать метод flush и почему мы ее используем?

    вам обычно не нужно flush() и OutputStream, он не потеряет никаких данных, если вы правильно close() его в конце концов. Иногда вы хотите связаться с базовым приемником данных (например, network Socket местные File или еще OutputStream), что вы хотите, чтобы любые данные, записанные в поток, были сброшены / обработаны, но согласно the flush() API doc, это не гарантируется произойдет.

  2. что делает метод close нести счет здесь?

    я действительно не понимаю эту часть, но close() закрытие OutputStream и заставляет его записывать любые данные, которые он все еще буферизовал-поэтому нет необходимости вызывать flush() до close(). Ан OutputStream невозможно записать после того, как он был закрытый.

  3. myObj2 = (John) ois.readObject(); ... пожалуйста, исправьте меня, если я ошибаюсь, Я читаю объект file и сохраняю в другой объект и типизирую объект file.

    неправильно, Вы читаете из ObjectInputStream ois, не имеет значения, откуда у него есть данные (в вашем случае это действительно происходит из файла, но в вашем коде нет "файлового объекта").

    ObjectInputStream смогите реконструировать все данные ранее написанные / сериализованные by ObjectOutputStream -- так в этом случае вы де-сериализовать ранее сериализованный объект типа John. Поскольку сериализация работает только на некоторых типах Java (примитивы и реализаторы Serializable), он не знает о твоем конкретном классе John. Но вы знаете, вы ранее serizalized в John объект, так что вы можете безопасно бросить из Object to John и назначьте его локальной переменной.

  4. какие альтернативы Сериализация и сохранение данных в Java. Я не хочу, чтобы данные в файл как поток байтов.

    вы можете изучить другие подходы сериализации/маршалинга, такие как кинокомпании xStream, JSON или сверните свой собственный (сложный, только сделайте это, если у вас есть веская причина). Большинство из них окажутся более сложными, чем встроенная сериализация, поэтому убедитесь, что у вас есть веская причина не просто написать "itno-файл как байтовый поток".


1) чтобы убедиться, что все возможные буферизованные байты записаны. Вижу Ява.Ио.Клиенту OutputStream.врезная().

2) не уверен, что вы имеете в виду, но вызовы close () должны быть помещены в блок finally, чтобы гарантировать, что ресурс закрыт. Быстрый Google показывает - статьи.

3) Вы не читаете объект file. Вы читаете ранее сериализованный объект Java из файла. Надеюсь, этот объект будет типа John, иначе вы получите Исключение ClassCastException. Это будет тип John, как вы ранее называли " oos.writeObject (myObj)", где myObj имеет тип John.

4) Google для сериализации Java-объектов. Существует множество библиотек для сериализации объектов Java в двоичные файлы, xml, json и т. д. Сам JDK поставляется с одним под названием XMLEncoder.


  1. вы используете flush () чтобы очистить внутренние буферы(если они есть) и принудительно записать (т. е. очистить) все ожидающие данные в назначение потока.
  2. закрыть() метод используется для закрытия потока, после вызова вы больше не можете использовать поток.
  3. нет. Вы читаете "объект John из файла". Объект типа John должен был быть предварительно сериализован в файл.
  4. есть многие альтернативы сериализации Java, такие как кинокомпании xStream. См. этот ответ так для Альтернативы для сериализации.

  1. когда использовать flush:

функция Flush заключается в том, чтобы явно попросить Java-программу записать что-то на диск, что означает выполнение ввода-вывода. Скажем, если мы используем bufferedOutputStream, когда мы пишем ("что-то"), он сохраняется в буфере, но еще не на диске. Когда вы вызываете flush, он будет записывать материалы в буфер на диск. Обычно вам не нужно вызывать флеш самостоятельно, потому что для этого требуется IO и снизить скорость. Поток будет автоматически промыть, когда буфер заполнен. Если вы не хотите, содержимое обновляется на диск, вы можете использовать flush.

  1. извините, не понял ваш вопрос? какой счет?

  2. это то, что делает сериализация, она позволяет хранить некоторый объект в вашей файловой системе и возвращать его. Вы читаете поток байтов и преобразуете его обратно в объект.

  3. есть много способов (xml, база данных, txt-файл), напишите свой собственный формат для хранения данных в локальном файле или в базе данных. Позвольте мне привести ваш пример, Джон. Он имеет имя и атрибуты отдела. Вы можете написать вывод формата, который принимает экземпляр John, и сделать следующее.

    клиенту OutputStream.написать ("класс John\n"); клиенту OutputStream.write ("toString:"+instance+ " \n"); клиенту OutputStream.close();

затем он сохранит как локальный txt-файл, который вы можете открыть и прочитать.