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

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

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

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

Ответы (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”?

Источник

File Stream. Flush Метод

Определение

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

Очищает буферы для этого потока и вызывает запись всех буферизованных данных в файл.

Перегрузки

Очищает буферы для этого потока и вызывает запись всех буферизованных данных в файл.

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

Flush()

Очищает буферы для этого потока и вызывает запись всех буферизованных данных в файл.

Исключения

Примеры

Этот пример кода является частью большого примера, приведенного для Lock метода.

Комментарии

Этот метод переопределяет метод Stream.Flush.

При вызове FileStream.Flush метода буфер ввода-вывода операционной системы также очищается.

Кодировщик потока не очищается, если не был явно вызван Flush или удален объект. Значение StreamWriter.AutoFlush true указывает, что данные будут сброшены из буфера в поток, но состояние кодировщика не будет сбрасываться. Это позволяет кодировщику оставаться в состоянии (частичные символы), чтобы он мог правильно кодировать следующий блок символов. Этот сценарий влияет на UTF8 и UTF7, где определенные символы могут быть закодированы только после того, как кодировщик получит смежный символ или символы.

Поскольку буфер можно использовать для чтения или записи, Flush() выполняет следующие две функции:

Все данные, ранее записанные в буфер, копируются в файл, и буфер удаляется, за исключением состояния кодировщика.

Если BufferedStream.CanSeek параметр имеет значение true и данные были ранее скопированы из файла в буфер для чтения, текущее расположение в файле уменьшается на число непрочитанных байтов в буфере. Затем буфер удаляется.

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

Источник

Можно ли 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”?

Источник

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

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

6 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Какова цель flush () в потоках Java?

Подскажите несколько предложений.

7 ответов

Из документации из flush метод:

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

Если буфер заполнен, все строки, которые буферизированы в нем, будут сохранены на диск. Буферы используются, чтобы избежать больших сделок! и накладные расходы.

В классе BufferedWriter, который помещается в java libs, есть одна строка вроде:

Если вы хотите отправить данные до того, как буфер заполнится, у вас есть контроль. Просто промойте это. Вызовы writer.flush () говорят: «Отправьте все, что есть в буфере, сейчас же!

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

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

В дополнение к другим хорошим ответам здесь это объяснение прояснило для меня все:

Источник

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

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