можно ли flush для небуферизированного потока и что будет

Можно ли flush() для небуферизированного потока и что будет?

Начинаю изучать тему IO и NIO.

Знаю, что flush() заставляет поток очистить свои внутренние буферы. Не могу понять, можно ли использовать flush() для небуферизированного потока и что будет?

2 ответа 2

Как следует из описания flush() :

This method forces any data that may have been buffered to be written to the underlying output device. Please note that the host environment might perform its own buffering unbeknowst to Java. In that case, a write made (for example, to a disk drive) might be cached in OS buffers instead of actually being written to disk.

В переводе на русский означает, что flush() вызывает чистку буфера вызывая метод реализованный в самой ОС поверх которой работает JVM. При этом даже отсутствие буфера в самом потоке не означает, что не будет использоваться в качестве буфера кэш диска на уровне ОСи или даже ниже.

В общем, flush() является хорошим тоном для любого потока, поскольку, девелопер не знает есть ли буфер на уровне ОС (более того девелопер обычно даже и не знает что за ось будет использована).

Мне кажется ответ уважаемого @Barmaley не корректен. Это мое оценочное суждение)

This method forces any data that may have been buffered to be written to the underlying output device. Please note that the host environment might perform its own buffering unbeknowst to Java. In that case, a write made (for example, to a disk drive) might be cached in OS buffers instead of actually being written to disk.

Мое понимание процитированной документации, что вызов метода flush() гарантирует только то, что байты, ранее записанные в поток, передаются операционной системе для записи, но не гарантирует записи на диск. Вот ссылка на верный по моему мнению ответ: FileOutputStream: Does the “close” method calls also “flush”?

Источник

Когда/почему вызывать System.out.flush() в Java

Почему некоторые потоки необходимо очищать ( FileOutputStream и потоки из сокетов), в то время как стандартный выходной поток не работает?

Что-то вроде этого заставляет меня задаться вопросом, является ли просто вызов System.out.println() независимым от платформы, поскольку некоторые системы могут понадобиться вам для очистки потока.

ОТВЕТЫ

Ответ 1

Таким образом, описанный вами случай println явно обрабатывается, а случай write с byte[] также гарантированно очищается, потому что он подпадает под «всякий раз, когда байт-массив написан».

Если вы замените System.out на System.setOut и не будете использовать поток автозаполнения, тогда вам нужно будет очистить его, как и любой другой поток.

Ответ 2

Необязательно, a PrintStream может быть создан для автоматической смены; это означает, что метод flush автоматически вызывается после записи байтового массива, вызывается один из методов println или записывается символ новой строки или байта ( ‘\n’ ).

Хотя я не вижу в нем явно упоминания, я понимаю, что System.out выполнит эту автоматическую промывку.

Ответ 3

Если вы не можете дождаться появления элемента, сбросьте поток.

Когда JVM идет вниз, а не очистка потока, он рискует потерять элемент в буфере дисплея, что может сделать разумное сообщение об ошибке, сообщающее вам, почему JVM потерял навсегда. Это делает отладку гораздо более сложной, как люди тогда склонны говорить: «но она не попала сюда, потому что она напечатала бы это».

Источник

Как работает Flush в Hibernate

В этой статье рассмотрим, что делает метод flush(), и когда он вызывается неявно.

Что такое flush()

Этот метод есть как у JPA EntityManager:

так и у Hibernate Session:

Он транслирует изменения отслеживаемых сущностей в базу данных, то есть выполняет накопившиеся SQL-команды.

Режим FlushMode.AUTO

Дело в том, что когда мы переводим JPA сущности из одного состояния в другое, то есть вызываем для них методы сохранения, удаления (persist(), merge(), remove()), немедленного выполнения SQL-команд не происходит. SQL-команды накапливаются, а выполнение их откладывается на потом, до необходимого момента, а именно:

С п.1 все ясно — в конце транзакции изменения всё же должны попасть в базу данных.

Что касается п. 2 и 3 — если перед select не сбросить изменения в базу, то select их не увидит, поэтому 2 и 3 тоже считаются необходимыми моментами. Транзакция должна видеть изменения, сделанные в ней самой.

Именно так работает автоматический режим сброса изменений в базу FlushMode.AUTO. Специально его устанавливать не надо, он и так стоит.

Но иногда все-таки нужно сбросить изменения в базу вручную методом flush().

Пример использования flush()

Дело в том, что автоматически изменения сбрасываются в базу еще и в определенном порядке, и persist() выполняется перед remove().

Рассмотрим пример. Пусть у нас есть класс City с уникальным названием:

Попробуем сохранить в базу город, затем удалить его и снова сохранить город с тем же названием. Несмотря на то, что название уникально, второе сохранение должно сработать, ведь мы удалили город. Но на самом деле без flush() возникнет ошибка, потому что сброс изменений запланирован на конец транзакции, и мало того, удаление идет в самом конце.

Благодаря em.flush() после em.remove() удается сразу протолкнуть в базу удаление, до того, как будет выполнена попытка повторного persist(). И избежать исключения.

Код выше приведен только для демонстрации смысла flush().

Еще раз, без flush() операции выполняются (точнее, пытаются выполниться) в конце транзакции в таком порядке, что вызывает исключение:

До delete не доходит, нарушение уникальности вызывает второй insert.

А такой порядок операций с flush():

Тут методом flush() мы принудительно вызываем сброс накопившихся изменений (первый persist() и remove()) в базу, так что remove() проходит.

Порядок сброса операций в базу

Вообще при сбросе изменений в базу операции выполняются в таком порядке:

Удаление (EntityDeleteAction) идет в самом конце, что и случается в предыдущем примере.

Источник

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

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

6 ответов

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

Что делает метод закрытия, носящий здесь счет?

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

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

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

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

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

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

НЕПРАВИЛЬНО! Вы читаете некоторые данные из потока, которые указывают его на Джона (который будет бросать, если объект был прочитан не John)

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

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

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

Что делает метод закрытия, носящий здесь счет?

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

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

Источник

Java 8 потоки ввода/вывода

Содержание

Введение

Поток ввода/вывода (I/O Stream) представляет собой источник данных или место их назначения. Потоки могут представлять собой абсолютно различные источники и места назначения: файлы на диска, устройства, сеть, другие программы, массивы в памяти т. д.

Потоки поддерживают большое количество различных типов данных: байты, примитивные типы, локализованные символы, объекты. Некоторые потоки просто передают данные, другие изменяют в соответствии со своими потребностями.

Независимо от внутреннего устройства потоки представляют собой одинаковую модель для программы. Поток представляет собой последовательность данных.

Потоки байт

Диаграмма классов, показывающая иерархию основных дочерних классов для класса java.io.InputStream

можно ли flush для небуферизированного потока и что будет. Смотреть фото можно ли flush для небуферизированного потока и что будет. Смотреть картинку можно ли flush для небуферизированного потока и что будет. Картинка про можно ли flush для небуферизированного потока и что будет. Фото можно ли flush для небуферизированного потока и что будет

Диаграмма классов, показывающая иерархию основных дочерних классов для класса java.io.OutputStream

java.io.InputStream

Абстрактный класс, являющийся базовым классом для всех классов, представляющий поток ввода.

Основные методы:

Возвращает количество байт, которое может быть прочитано из потока без блокировки. Некоторые реализации InputStream возвращают полное количество байт в потоке, но не все. Не стоит использовать этот метод для определения размера буфера, который будет хранить все данные из потока.

Закрывает поток и освобождает все ресурсы.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *