что делает flush java
Система ввода/вывода
Java имеет в своём составе множество классов, связанных с вводом/выводом данных. Рассмотрим некоторые из них.
Класс File
В отличие от большинства классов ввода/вывода, класс File работает не с потоками, а непосредственно с файлами. Данный класс позволяет получить информацию о файле: права доступа, время и дата создания, путь к каталогу. А также осуществлять навигацию по иерархиям подкаталогов.
Подробнее о классе java.io.File
Поток
Есть два типа потоков: байтовые и символьные. В некоторых ситуациях символьные потоки более эффективны, чем байтовые.
За ввод и вывод отвечают разные классы Java. Классы, производные от базовых классов InputStream или Reader, имеют методы с именами read() для чтения отдельных байтов или массива байтов (отвечают за ввод данных). Классы, производные от классов OutputStream или Write, имеют методы с именами write() для записи одиночных байтов или массива байтов (отвечают за вывод данных).
Подробнее о классе InputStream
Класс OutputStream
В этой категории находятся классы, определяющие, куда направляются ваши данные: в массив байтов (но не напрямую в String; предполагается что вы сможете создать их из массива байтов), в файл или канал.
BufferedOutputStream Буферизированный выходной поток ByteArrayOutputStream Создает буфер в памяти. Все данные, посылаемые в этот поток, размещаются в созданном буфере DataOutputStream Выходной поток, включающий методы для записи стандартных типов данных Java FileOutputStream Отправка данных в файл на диске. Реализация класса OutputStream ObjectOutputStream Выходной поток для объектов PipedOutputStream Реализует понятие выходного канала. FilterOutputStream Абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства.
BufferedOutputStream
Класс BufferedOutputStream не сильно отличается от класса OutputStream, за исключением дополнительного метода flush(), используемого для обеспечения записи данных в буферизируемый поток. Буферы вывода нужно для повышения производительности.
ByteArrayOutputStream
Класс ByteArrayOutputStream использует байтовый массив в выходном потоке. Метод close() можно не вызывать.
DataOutputStream
Класс DataOutputStream позволяет писать элементарные данные в поток через интерфейс DataOutput, который определяет методы, преобразующие элементарные значения в форму последовательности байтов. Такие потоки облегчают сохранение в файле двоичных данных.
Класс DataOutputStream расширяет класс FilterOutputStream, который в свою очередь, расширяет класс OutputStream.
Методы интерфейса DataOutput:
FileOutputStream
Класс FileOutputStream создаёт объект класса OutputStream, который можно использовать для записи байтов в файл. Создание нового объекта не зависит от того, существует ли заданный файл, так как он создаёт его перед открытием. В случае попытки открытия файла, доступного только для чтения, будет передано исключение.
Классы символьных потоков
Символьные потоки имеют два основных абстрактных класса Reader и Writer, управляющие потоками символов Unicode.
Reader
Методы класса Reader:
Класс BufferedReader
Класс BufferedReader увеличивает производительность за счёт буферизации ввода.
Класс CharArrayReader
Класс CharArrayReader использует символьный массив в качестве источника.
Класс FileReader
Класс FileReader, производный от класса Reader, можно использовать для чтения содержимого файла. В конструкторе класса нужно указать либо путь к файлу, либо объект типа File.
Writer
Класс BufferedWriter
Класс CharArrayWriter
Класс CharArrayWriter использует массив для выходного потока.
Класс FileWriter
Класс FileWriter создаёт объект класса, производного от класса Writer, который вы можете применять для записи файла. Есть конструкторы, которые позволяют добавить вывод в конец файла. Создание объекта не зависит от наличия файла, он будет создан в случае необходимости. Если файл существует и он доступен только для чтения, то передаётся исключение IOException.
Чтение и запись файлов
В filename нужно указать имя файла, который вы хотите открыть. Если при создании входного потока файл не существует, передаётся исключение FileNotFoundException. Аналогично для выходных потоков, если файл не может быть открыт или создан, также передаётся исключение. Сам класс исключения происходит от класса IOException. Когда выходной файл открыт, любой ранее существовавший файл с тем же именем уничтожается.
После завершения работы с файлом, его необходимо закрыть с помощью метода close() для освобождения системных ресурсов. Незакрытый файл приводит к утечке памяти.
В JDK 7 метод close() определяется интерфейсом AutoCloseable и можно явно не закрывать файл, а использовать новый оператор try-с-ресурсами, что для Android пока не слишком актуально.
Иногда используют вариант, когда метод close() помещается в блок finally. При таком подходе все методы, которые получают доступ к файлу, содержатся в пределах блока try, а блок finally используется для закрытия файла. Таким образом, независимо от того, как закончится блок try, файл будет закрыт.
Так как исключение FileNotFoundException является подклассом IOException, то не обязательно обрабатывать два исключения отдельно, а оставить только IOException, если вам не нужно отдельно обрабатывать разные причины неудачного открытия файла. Например, если пользователь вводит вручную имя файла, то более конкретное исключение будет к месту.
Для записи в файл используется метод write().
Метод пишет в файл байт, переданный параметром value. Хотя параметр объявлена как целочисленный, в файл записываются только младшие восемь бит. При ошибке записи передаётся исключение.
В JDK 7 есть способ автоматического управления ресурсами:
Когда в Android будет полноценная поддержка JDK 7, то дополним материал.
Чтобы открыть файл для посимвольного чтения, используется класс FileInputReader; имя файла задаётся в виде строки (String) или объекта File. Ускорить процесс чтения помогает буферизация ввода, для этого полученная ссылка передаётся в конструктор класса BufferedReader. Так как в интерфейсе класса имеется метод readLine(), все необходимое для чтения имеется в вашем распоряжении. При достижении конца файла метод readLine() возвращает ссылку null.
Объект FileWriter записывает данные в файл. При вводе/выводе практически всегда применяется буферизация, поэтому используется BufferedWriter.
Когда данные входного потока исчерпываются, метод readLine() возвращает null. Для потока явно вызывается метод close(); если не вызвать его для всех выходных файловых потоков, в буферах могут остаться данные, и файл получится неполным.
PrintWriter форматирует данные так, чтобы их мог прочитать человек. Однако для вывода информации, предназначенной для другого потока, следует использовать классы DataOutputStream для записи данных и DataInputStream для чтения данных.
Единственным надежным способом записать в поток DataOutputStream строку так, чтобы ее можно было потом правильно считать потоком DataInputStream, является кодирование UTF-8, реализуемое методами readUTF() и writeUTF(). Эти методы позволяют смешивать строки и другие типы данных, записываемые потоком DataOutputStream, так как вы знаете, что строки будут правильно сохранены в Юникоде и их будет просто воспроизвести потоком DataInputStream.
Метод writeDouble() записывает число double в поток, а соответствующий ему метод readDouble() затем восстанавливает его (для других типов также существуют подобные методы).
Работа с классом RandomAccessFile напоминает использование совмещенных в одном классе потоков DataInputStream и DataOutputStream (они реализуют те же интерфейсы DataInput и DataOutput). Кроме того, метод seek() позволяет переместиться к определенной позиции и изменить хранящееся там значение.
При использовании RandomAccessFile необходимо знать структуру файла. Класс RandomAccessFile содержит методы для чтения и записи примитивов и строк UTF-8.
RandomAccessFile может открываться в режиме чтения («r») или чтения/записи («rw»). Также есть режим «rws», когда файл открывается для операций чтения-записи и каждое изменение данных файла немедленно записывается на физическое устройство.
Исключения ввода/вывода
В большинстве случаев у классов ввода/вывода используется исключение IOException. Второе исключение FileNotFoundException передаётся в тех случаях, когад файл не может быть открыт. Данное исключение происходит от IOException, поэтому оба исключения можно обрабатывать в одном блоке catch, если у вас нет нужды обрабатывать их по отдельности.
Что делает метод flush()?
У Шилдта один из конструкторов класса PrintWriter описан следующим образом:
«PrintWriter(OutputStream outputStream, boolean flushOnNewline)
где в качестве первого параметра, outputStream, конструктору передается объект типа OutputStream, а второй параметр, flushOnNewline, указывает, должен ли буфер выходного потока сбрасываться каждый раз, когда вызывается (среди прочих других) метод println(). Если параметр flushOnNewline принимает значение true, сбрасывание буфера выполняется автоматически»
Класс AccessibleObject метод setAccessible(AccessibleObject[] array, boolean flag) что он делает?
Пример из учебника Хорстмана Том 2 Пытался разобраться по документации пробовал,методом тыка.
Передать в метод «что-то», что бы метод мог в это «что-то» записать матрицу неизвестной размерности
Опишу суть проблемы подробнее. Есть метод, который умножает две матрицы, мне бы хотелось, что бы.
Решение
Решение
alicesmagic3d, а ведь я писал про то как в Идее почитать доки по методам.
Вас смутило слово сброс? ну переведите это как заливка. То есть копим данные в буффере, а потом раз и залили в подключенный ресурс.
If the intended destination of this stream is an abstraction provided
* by the underlying operating system, for example a file, then flushing the
* stream guarantees only that bytes previously written to the stream are
* passed to the operating system for writing; it does not guarantee that
* they are actually written to a physical device such as a disk drive.
Какова цель flush () в потоках Java?
Подскажите несколько предложений.
7 ответов
Из документации из flush метод:
Очищает выходной поток и заставляет записывать все буферизованные выходные байты. Общий контракт сброса заключается в том, что его вызов указывает на то, что, если какие-либо ранее записанные байты были буферизованы реализацией выходного потока, такие байты должны быть немедленно записаны в их предполагаемое место назначения.
Если буфер заполнен, все строки, которые буферизированы в нем, будут сохранены на диск. Буферы используются, чтобы избежать больших сделок! и накладные расходы.
В классе BufferedWriter, который помещается в java libs, есть одна строка вроде:
Если вы хотите отправить данные до того, как буфер заполнится, у вас есть контроль. Просто промойте это. Вызовы writer.flush () говорят: «Отправьте все, что есть в буфере, сейчас же!
К потокам часто обращаются потоки, которые периодически очищают свое содержимое и, например, отображают его на экране, отправляют в сокет или записывают в файл. Это сделано из соображений производительности. Очистка выходного потока означает, что вы хотите остановиться, дождаться, пока содержимое потока будет полностью передано по назначению, а затем возобновить выполнение с пустым потоком и отправленным содержимым.
Из-за проблем с производительностью первые данные должны быть записаны в буфер. Когда буфер заполняется, данные записываются в вывод (файл, консоль и т. Д.). Когда буфер частично заполнен и вы хотите отправить его на вывод (файл, консоль), вам необходимо вызвать метод 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-файл, который вы можете открыть и прочитать.
Потоки вывода
1. Класс OutputStream
С потоками ввода мы только что разобрались. Настало время поговорить о потоках вывода.
Класс OutputStream является классом-родителем для всех классов, которые поддерживают байтовый вывод. Это абстрактный класс, который сам ничего не делает: для этого у него есть классы-наследники на все случаи жизни.
Сложновато звучит. Если попроще, этот класс оперирует байтами, а не, например, символами или другими типами данных. А то, что он абстрактный, значит, что мы обычно используем не его, а один из его классов-наследников. Например, FileOutputStream и ему подобные.
Методы | Описание |
---|---|
Записывает один байт (не int ) в поток. | |
Записывает массив байт в поток | |
Записывает часть массива байт в поток | |
Записывает в поток все данные, которые хранятся в буфере | |
Закрывает поток |
При создании объекта класса-наследника InputStream обычно указывается объект-источник, из которого InputStream читает данные. При создании объекта класса-наследника OutputStream также обычно указывается целевой объект или целевой поток, в который будут записываться данные.
Вкратце пройдемся по всем методам класса OutputStream :
Метод write(int b)
Этот метод записывает в поток вывода один байт (не int ). Переданное значение приводится к типу байт, три первые байта отбрасываются.
Метод write(byte[] buffer)
Записывает в поток вывода переданный массив байтов. Все.
Метод write(byte[] buffer, int offset, int length)
Записывает в поток вывода часть переданного массива байтов. Переменная offset задает номер первого элемента массива, length — длина записываемого фрагмента.
Метод flush()
Метод flush() используется, чтобы принудительно записать в целевой поток данные, которые могут кэшироваться в текущем потоке. Актуально при использовании буферизации и/или нескольких объектах потоков, организованных в цепочку.
Метод close()
Пример — копирование файла
InputStream для чтения из файла
OutputStream для записи в файл
Буфер, в который мы будем считывать данные
Пока данные есть в потоке
Считываем данные в буфер
Записываем данные из буфера во второй поток
2. Класс Writer
Это абстрактный класс: объекты класса Writer создать нельзя. Его основная цель — быть единым классом-родителем для сотен классов-наследников и задать для них общие методы работы с символьными потоками.
Методы класса Writer (и всех его классов-наследников):
Методы | Описание |
---|---|
Записывает один символ (не int ) в поток. | |
Записывает массив символов в поток | |
Записывает часть массива символов в поток | |
Записывает строку в поток | |
Записывает часть строки в поток | |
Записывает в поток все данные, которые хранятся в буфере | |
Закрывает поток |
Краткое описание методов:
Метод write(int b)
Метод write(char[] buffer)
Записывает в поток вывода переданный массив символов.
Метод write(char[] buffer, int offset, int length)
Записывает в поток вывода часть переданного массива символов. Переменная offset задает номер первого элемента массива, length — длина записываемого фрагмента.
Метод write(String str)
Записывает в поток вывода переданную строку.
Метод write(String str, int offset, int length)
Записывает в поток вывода часть переданной строки: строку преобразуют в массив символов. Переменная offset задает номер первого элемента массива, length — длина записываемого фрагмента.
Метод flush()
Метод flush() используется, чтобы принудительно записать в целевой поток данные, которые могут кэшироваться в текущем потоке. Актуально при использовании буферизации и/или нескольких объектах потоков, организованных в цепочку.
Метод close()
Пример программы, которая копирует текстовый файл:
Reader для чтения из файла
Writer для записи в файл
Буфер, в который будем считывать данные
Пока данные есть в потоке
Читаем данные в буфер
Записываем данные из буфера во второй поток
Класс StringWriter
Код | Примечание |
---|---|
Создается целевой символьный поток StringWriter Строка пишется в буфер внутри StringWriter Строка пишется в буфер внутри StringWriter Преобразовываем содержимое объекта к строке |